Page 1 of 1

ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Mon Jun 11, 2018 12:27 pm
by Arm_anucha
มีข้อส่งสัยครับว่าสามารถทำได้แบบนี้หรือเปล่าแบบนี้
Database ของทุก sheet จะเป็นแบบ Table และไม่สามารถรวม Database เป็น Sheet เดียวได้ต้องแยก
1. มีรูปแบบวันที่ของแต่ละ sheet วันที่เดียวกัน
2. มีรูปแบบครั้งที่ของแต่ละ Sheet เหมือนกัน
อยากจะให้เมื่อพิมพ์ที่ Sheet แสดงข้อมูลที่ A4 จะเป็นวันที่หรือครั้งที่ก็ได้ แล้วให้ข้อมูลมาแสดงทั้งหมดตัวอย่างคำตอบอยู่ในไฟล์
สามารถทำได้หรือเปล่าครับ โดยใช้สูตรในส่วนที่ไม่มีข้อมูลให้เป็น - แทน

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Mon Jun 11, 2018 3:34 pm
by DhitiBank
ชีท ก.4 และ ก.5 ไม่มีคอลัมน์ "ครั้งที่" หรือครับ? หากไม่มีแสดงว่าไม่ต้องค้นหาจากสองชีทนี้ใช่หรือเปล่าครับ

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Mon Jun 11, 2018 4:14 pm
by Arm_anucha
ก.4 และ ก.5 ไม่มีคอรัมน์ "ครั้งที่" ครับ แต่ให้หาจากวันที่แทนแบบนี้ครับ โดยไม่ต้องมีคอลัมน์ "ครั้งที่" ก็ได้ครับ

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Tue Jun 12, 2018 7:12 am
by snasui
:D การค้นหาข้อมูลจากหลายคอลัมน์และแต่ละชีตมีหัวคอลัมน์ไม่เหมือนกันต้องพึ่ง VBA เข้ามาจัดการ ลองเขียนมาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Tue Jun 12, 2018 11:42 am
by Arm_anucha
ลองเขียนดูแล้วครับตอนนี้ติดตรงที่ว่า
1. จะทำให้หัวข้อข้อมูล Database ตรงกับหัวข้อของ sheet "แสดงข้อมูล" อย่างไร
2. อยากจะให้ค้นหา all sheet ตอนนี้ทำได้แค่ 1 sheet เท่านั้นครับ
3. จำทำอย่างไรให้เมื่อพิมที่ A4 พิมพ์ข้อมูลที่จะหาเป็นอะไรก็ได้อย่างเช่น 1/6/2018 , 1 , ก1 ไก่ , ส1
ตัวอย่างคำตอบอยู่ที่ sheet "ตย คำตอบ" ครับ

Code: Select all

Sub seachdara()
Dim ws As Worksheet
Dim lastrow As Long
Dim count As Integer

lastrow = Sheets("ก1").Cells(Rows.count, 1).End(xlUp).Row
Sheet6.Range("B6:Q200").ClearContents
count = 0
Dim p As Long
p = 5
For x = 1 To lastrow
    If Sheets("ก1").Cells(x, 1) = Sheet6.Range("A4") Then
        Sheet6.Cells(p, 2) = Sheets("ก1").Cells(x, 1)
        Sheet6.Cells(p, 3) = Sheets("ก1").Cells(x, 2)
        Sheet6.Cells(p, 4) = Sheets("ก1").Cells(x, 3)
        Sheet6.Cells(p, 5) = Sheets("ก1").Cells(x, 4)
        Sheet6.Cells(p, 6) = Sheets("ก1").Cells(x, 5)
        Sheet6.Cells(p, 7) = Sheets("ก1").Cells(x, 6)
        p = p + 1
        count = count + 1
  End If
  If Sheets("ก1").Cells(x, 1 + 1) = Sheet6.Range("A4") Then
        Sheet6.Cells(p, 2) = Sheets("ก1").Cells(x, 1)
        Sheet6.Cells(p, 3) = Sheets("ก1").Cells(x, 2)
        Sheet6.Cells(p, 4) = Sheets("ก1").Cells(x, 3)
        Sheet6.Cells(p, 5) = Sheets("ก1").Cells(x, 4)
        Sheet6.Cells(p, 6) = Sheets("ก1").Cells(x, 5)
        Sheet6.Cells(p, 7) = Sheets("ก1").Cells(x, 6)
        p = p + 1
        count = count + 1
  End If
    Next x
End Sub

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Tue Jun 12, 2018 4:29 pm
by DhitiBank
ลองปรับโค้ดแบบนี้ครับ แนวคิดคือ
- เริ่มลูปแต่ละชีท
- ในแต่ละชีทก็ให้เริ่มลูปแต่ละแถวในคอลัมน์วันที่
- เมื่อพบวันที่ตรงก็ให้เริ่มลูปหัวคอลัมน์เทียบกันระหว่างหัวคอลัมน์ชีทรายงานกับชีทฐานข้อมูล

โค้ดนี้เขียนสำหรับการค้นหาด้วยวันที่อย่างเดียว สำหรับการหาด้วยครั้งที่ลองปรับดูครับ

Code: Select all

Sub test()
Dim wsResult As Worksheet, ws As Worksheet, l As Long, _
    r1 As Range, r2 As Range, r3 As Range, _
    rRow As Range, rCol As Range, rColHead As Range
    Set wsResult = ActiveSheet
    Set rColHead = wsResult.Range("b4:q4")
    
    wsResult.Range("b5:q2000").ClearContents
    l = 5
    
    '~~> เริ่มลูปแต่ละชีท
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name Like "ก*" Then
            Set rRow = ws.Range("a2", ws.Range("a" & Rows.count).End(xlUp))
            Set rCol = ws.Range("b1", ws.Range("aa1").End(xlToLeft))
            '~~> เริ่มลูปแต่ละแถว
            For Each r1 In rRow
                If r1.Value = wsResult.Range("a4").Value Then
                    '~~>หากเจอวันที่ตรงก็เช็คว่าคอลัมน์อะไร
                    For Each r2 In rCol
                        For Each r3 In rColHead
                            If r2.Value = r3.Value Then
                                wsResult.Cells(l, r3.Column).Value = _
                                    ws.Cells(r1.Row, r2.Column).Value
                                Exit For
                            End If
                        Next r3
                    Next r2
                    l = l + 1
                End If
            Next r1
        End If
    Next ws
End Sub
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ส่วนการใช้สูตร คงต้องเอาข้อมูลทั้งหมดในฐานข้อมูลมารวมในชีทเดียวกันก่อนเพราะหัวตารางเรียงไม่เหมือนกัน แล้วค่อยเขียนสูตรดึงข้อมูลมาไว้ในชีทรายงานอีกทีครับ ลองดูตัวอย่างในไฟล์แนบ ขั้นตอนการทำคร่าวๆ คือ
- สร้างชีทใหม่ (กรณีนี้คือ sheet1) แล้วคัดลอกหัวตารางในชีทรายงานมาวางไว้ในชีทนี้
- พิมพ์ชื่อชีทฐานข้อมูลทั้งหมดลงไป เขียนสูตรนับข้อมูลในแต่ละชีท
- เขียนสูตรดึงข้อมูลในแต่ละชีทฐานข้อมูลมาไว้ใน sheet1

แต่วิธีนี้มีข้อจำกัดหลายอย่างครับ เช่น
- ไม่เหมาะกับข้อมูลจำนวนมาก เพราะจะคำนวณช้า
- หากเพิ่มชีท ต้องพิมพ์ชื่อชีทเพิ่มเข้าไปใน sheet1 และคัดลอกสูตรเผื่อลงไปอีก
- อาจงงได้ และอาจเผลอไปลบสูตรบางที่

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Tue Jun 12, 2018 8:30 pm
by Arm_anucha
ขอบคุณครับเดียวจะลองนำไปปรับใช้ดูครับ
ขอถามนิดนึงตรง
If ws.Name Like "ก*" Then
ถ้านำไปใช้จริงอันนี้ต้องเปลี่ยนเป็นอะไรครับอย่างชื่อชีทแต่ละชีทไม่เหมือนกัน

Re: ดึงข้อมูลที่ค้นหาของทุก Sheet

Posted: Tue Jun 12, 2018 9:09 pm
by DhitiBank
เงื่อนไขตรงนั้นมีไว้เพื่อเลือกเฉพาะชีทที่เป็นฐานข้อมูลครับ เวลาคำสั่งลูปมาเจอชีทรายงานจะได้ข้ามไปเลย แต่หากชื่อชีทฐานข้อมูลไม่มีรูปแบบที่เหมือนกัน ก็ให้เปลี่ยนเป็น "ชื่อของ ws ไม่ตรงกับชื่อชีทรายงาน" ก็ได้ครับ เช่น

ชีทรายงานชื่อ "Report" ก็ปรับโค้ดเป็น
If ws.Name <> "Report" then