ลองปรับโค้ดแบบนี้ครับ แนวคิดคือ
- เริ่มลูปแต่ละชีท
- ในแต่ละชีทก็ให้เริ่มลูปแต่ละแถวในคอลัมน์วันที่
- เมื่อพบวันที่ตรงก็ให้เริ่มลูปหัวคอลัมน์เทียบกันระหว่างหัวคอลัมน์ชีทรายงานกับชีทฐานข้อมูล
โค้ดนี้เขียนสำหรับการค้นหาด้วยวันที่อย่างเดียว สำหรับการหาด้วยครั้งที่ลองปรับดูครับ
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 และคัดลอกสูตรเผื่อลงไปอีก
- อาจงงได้ และอาจเผลอไปลบสูตรบางที่
You do not have the required permissions to view the files attached to this post.