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

การค้นหาข้อมูลจากหลายคอลัมน์และแต่ละชีตมีหัวคอลัมน์ไม่เหมือนกันต้องพึ่ง 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