Page 1 of 2
การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Wed Feb 08, 2012 9:19 pm
by bank9597

ผมมีเรื่องอยากให้ช่วย 2 เรื่องครับ คือ การเสิร์ซข้อมูลมาแสดง และการอัพเดทข้อมูล
ในชีทฟอร์ม ต้องการให้ข้อมูลมาแสดงในช่อง A19:E150 ครับ
โดย C4 กับ C5 เทียบข้อมูลกับชีท TaxInvoice ครับ
โดยเลือกสถานะที่เป็น "ค่าว่าง" และ "ยังไม่ครบ" เนื่องจาก 2 เงื่อนไขนี้อยู่ในคอลัมน์เดียวกันคือคอลัมน์ H ผมเลยยังแก้ไขไม่ได้
เบื้องต้นผมลองไล่สูตรไว้แล้วใน L4:L7 ชีท Form ส่วนใน A19:E150 ผมดึงคำตอบที่ถูกต้องด้วยมือมาให้ดูก่อนครับ
ส่วนข้อ 2 เป็นเรื่องของโค๊ด VBA ครับ
ผมได้ทำการเซฟข้อมูลไปเก็บ 2 ที่ ในการกดครั้งเดียว คือเซฟข้อมูลจากชีท Temp ไปยัง Database และเซฟจาก Sub_Temp ไปยังชีท Data
ผมเขียนโค๊ดทุกอย่างไว้เรียบร้อยแล้ว และใช้งานได้แล้ว แต่ติดปัญหาที่น่าเกียจบางอย่าง รวมถึงไม่มั่นใจในโค๊ดที่เขียนว่าจะกระชับพอหรือยัง มันยาวไปไหม หรือ มีอะไรที่สั้นกว่านี้ไหม ผมเลยให้อาจารย์ช่วยดูหน่อยครับ
ปัญหาคือ พอผมทำรายการในชีท Form เสร็จแล้ว กดบันทึก ให้อาจารย์สังเกตคอลัมน์ A ในชีท Data จะเห็นว่ามีรหัสที่ไม่เหมือนที่เราสั่งบันทึกไป เทียบกับรหัสในชีท Database ได้เลยว่า มันไม่เหมือนกัน ทั้งๆที่รหัสตอนที่เราสั่งบันทึก มันอันเดียวกัน ผมคิดว่าผมต้องพลาดอะไรสักอย่าง รวมถึงโค๊ดบางตัวที่ยากจะเข้าใจ รบกวนอาจารย์ช่วยดู และปรับให้ตามสมควรให้หน่อยน่ัะครับ
ในไฟล์แนบ พอเปิดมา ลองกดบันทึกดูผลได้เลยครับ

Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Thu Feb 09, 2012 7:23 am
by snasui

เงื่อนไขการ Search ตามที่ถามมาไม่ง่ายนักครับ ควรเติมคอลัมน์ H ของชีท Tax Invoice ด้วยค่าที่ควรจะเป็นแล้ว Search ตามค่านั้นมาแทน
ส่วน VBA ผมทดสอบแล้วไม่เจอความผิดปกติ ลองทดสอบด้วยการกดแป้น F8 เพื่อดูการทำงานทีละขั้น แล้วจับมาให้ดูหน่อยครับว่าผิดพลาดอย่างไร
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Thu Feb 09, 2012 9:48 am
by bank9597

ขอบคุณครับ เดี๋ยวผมจะลอกดูอีกที่ครับ
ส่วนโคีดมีข้อผิดพลาดแน่นอนครับ รหัสชำระเงินที่นำไปบันทึกที่ Database และ Data เหมือนกัน ที่ถูกต้องคือตั้งเหมือนกัน เพราะบันทึกจากที่เดียวกันครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Thu Feb 09, 2012 2:39 pm
by snasui

ช่วยทำข้อมูลตัวอย่างในไฟล์ที่เกิด Error มาด้วยครับ จะได้เห็นว่า Error เป็นแบบไหน เพราะเท่าที่ทดสอบ ไม่มีตัวอย่างในชีท Sub_Temp จังไม่เกิด Error ใด
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Thu Feb 09, 2012 3:05 pm
by bank9597

ขอบคุณครับอาจารย์ ผมแก้ปัยหาได้แล้วครับ เหลือแต่การเลือกเงื่อนไขให้เป็นอย่างเดียว กำลังพยายามอยู่ครับ อิอิ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 10, 2012 9:36 am
by ChoBkuN
อยากมีส่วนร่วม แต่ไม่เก่ง VBA ~ ~
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 10, 2012 11:27 am
by bank9597
อยากมีส่วนร่วม แต่ไม่เก่ง VBA ~ ~
ขอบคุณมากน่ะครับ ตอนนี้แก้ปัญหาได้แล้วครับ เหนื่อยไหลไปหลายวันเลยครับ

Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 10, 2012 5:04 pm
by bank9597

มีปัญหาเพิ่มเติมมาถามต่อครับ ผมทำการสั่งบันทึกข้อมูล ในชีท Form ปรากกฏว่ามันต้องกดตกลงกันหลายครั้ง กว่าจะบันทึกเสร็จ รบกวนอาจารย์ช่วยดูให้หน่อยได้ไหมครับ ว่าจะต้องตัดส่วนไหนออกไปบ้าง หรือต้องเพิ่มส่วนไหนลงไปบ้าง
โมดูลชื่อ Record

อีกปัญหาคือการใช้ VBA ดึงข้อมูลมาแสดงครับ ผมได้ทำโค๊ดไว้แล้ว แต่ยังแสดงผลไม่ถูกต้องรบกวนอาจารย์ดูอีกหน่อยได้ไหมครับ
โมดูลชื่อ Report_1 ครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 10, 2012 6:36 pm
by snasui
bank9597 wrote: มีปัญหาเพิ่มเติมมาถามต่อครับ ผมทำการสั่งบันทึกข้อมูล ในชีท Form ปรากกฏว่ามันต้องกดตกลงกันหลายครั้ง กว่าจะบันทึกเสร็จ รบกวนอาจารย์ช่วยดูให้หน่อยได้ไหมครับ ว่าจะต้องตัดส่วนไหนออกไปบ้าง หรือต้องเพิ่มส่วนไหนลงไปบ้าง
โมดูลชื่อ Record
ตัวอย่างที่ให้มาไม่พร้อมที่จะทดสอบครับ ซึ่งผมได้แจ้งไปรอบนึงแล้วตามด้านบน
bank9597 wrote:
อีกปัญหาคือการใช้ VBA ดึงข้อมูลมาแสดงครับ ผมได้ทำโค๊ดไว้แล้ว แต่ยังแสดงผลไม่ถูกต้องรบกวนอาจารย์ดูอีกหน่อยได้ไหมครับ
โมดูลชื่อ Report_1 ครับ
เนื่องจากเลือกช่วงข้อมูลไม่ครบจึงไม่ได้คำตอบที่ต้องการ นอกจากนี้ช่วงข้อมูลที่ Filter กับช่วงข้อมูลที่นำมาแสดงผลมีขนาดไม่เท่ากันจึงต้องปรับปรุง Code เพื่อนำเฉพาะข้อมูลที่ต้องการมาวางตามด้านล่างครับ
Code: Select all
Sub FilterDataAll()
Dim rSource As Range
Application.EnableEvents = False
With Sheets("Report")
If .Range("A8") <> "" Then
.Range("A8", .Range("D" & Rows.Count).End(xlUp)).ClearContents
End If
End With
With Sheets("TaxInvoice")
Set rSource = .Range("B2", .Range("H" & Rows.Count) _
.End(xlUp))
End With
rSource.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Sheets("Report").Range("K1:M2")
rSource.SpecialCells(xlCellTypeVisible).Resize(, 4).Copy
Sheets("Report").Range("A8").PasteSpecial xlPasteValues
Sheets("TaxInvoice").ShowAllData
Application.EnableEvents = True
End Sub
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Sat Feb 11, 2012 12:05 am
by bank9597

ขอบคุณครับอาจารย์
ในส่วนของการฟิลเตอร์นั้น สมบูรณืแล้วครับ ไม่มีปัญหาอีกแล้ว
และก็ต้องขออภัยที่อธิบายปัญหาข้อแรกไม่ชัดเจนครับ
ผมได้แนบไฟล์ Ver.2 มาให้อีกครับ จะได้ข้อมูลเหมือนกัน เพื่อทำการทดลองครับ
ขออธิการทดสอบ เพื่อนำไปสู่ปัญหาที่ต้องการช่วยให้แก้ครับ
เมื่อเปิดไฟล์มา ในชีท Form ที่เซลล์ C4 เลือก "บริษัท จุฬาวิศวกรรม จำกัด" ที่ C5 เลือก "หน่วยงานปากท่อ"
ด้านล่าง บรรทัดที่ 19 ลงมา จะเป็นข้อมูลใบวางบิลที่มีสถานะ "ค้างชำระ" มาแสดง ใน F19 ลงไปมีไว้ใส่เลขเพื่อชำระเงินตามใบวางบิลครับ
ซึ่งข้อมูลที่นำมาแสดงนั้น จะดึงมาจากชีท TexInvoice ครับ
สำหรับการทำงานของโค๊ด มีดังนี้ครับ
สั่งบันทึกข้อมูลจากชีท Temp ไปชีท Database
สั่งบันทึกข้อมูลจากชีท Sub_Temp ไปชีท Data
แล้วก็สั่งอัพเดทสถานะ "ชำระแล้ว" กับ "ค้างชำระ" ไปที่ชีท TexInvoice โดยให้ตรงกับรหัสใบวางบิลนั้นๆ
ปัญหาคือ พอทำรายการเสร็จแล้ว มันจะฟ้องว่า "บันทึกข้อมูลเรียบร้อยแล้ว" แล้วเราก็กดโอเค แต่มันต้องกดซ้ำหลายครั้งนี่สิครับ รู้เลยว่าต้องวางโค๊ดผิดหลักการแน่นอน จึงอยากให้อาจารย์ดูให้หน่อยครับว่า ต้องปรับโค๊ดอย่างไร ให้มันเสร็จสิ้นในการกด ตกลง คั้งเดียว
เอาตามไฟล์ล่าสุดน่ะครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Sat Feb 11, 2012 12:08 am
by snasui

นำ MsgBox ตรง Loop ออกไป ให้เหลือตามด้านล่างครับ
Code: Select all
For i = rtAll.Count To 1 Step -1
If rs = rtAll(i) And rs.Offset(0, -4) = rtAll(i).Offset(0, -2) _
And rs.Offset(0, 1) <> "" Then
rs.Offset(0, 2).Copy
rtAll(i).Offset(0, 5).PasteSpecial xlPasteValues
End If
Next i
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Sat Feb 11, 2012 1:23 pm
by bank9597

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

Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Mon Feb 13, 2012 9:18 am
by bank9597

อาจารย์ครับ ผมได้นำไปทดสอบกับข้อมูลจำนวนมากแล้ว ปรากฏว่าไม่สามารถดึงข้อมูลมาแสดงตามต้องการได้ครับ
อธิบายปัญหาและเงื่อนไข
เงื่อนไขที่ว่าคือเงื่อนไขเดิมครับ คือกำหนดค่าต่างๆในชีท Report ดังนี้ เลือกชื่อบริษัท ในเซลล์ C2 เลือกหน่วยงานในเซลล์ C3 เลือกสถานะในเซลล์ C4
โดยทำการดึงข้อมูลจากชีท TaxInvoice มาแสดงครับ
จากโค๊ดที่อาจารย์ให้มา มันจะดึงข้อมูลได้แค่เงื่อนไขเดียว คือ "บริษัท จุฬาวิศวกรรม จำกัด" "หน่วยงานปากท่อ" สถานะ "ค้างชำระ" แต่พอระบุเงื่อนไขอื่นๆ ระบบไม่ดึงข้อมูลมาแสดงเลย ไม่ทราบว่าสาเหตุเป็นเพราะอะไร
ผมขอแนบไฟล์ในข้อความน่ะครับ เพราะเป็นข้อมูลจริงและต้องปกปิด ต้องขออภัยด้วยครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Mon Feb 13, 2012 9:53 am
by snasui

ช่วย
เปลี่ยนข้อความสำคัญในไฟล์และทำมาเป็นตัวอย่างครับ เสียเวลาไปบ้างแต่เพื่อเป็นประโยชน์กับเพื่อน ๆ ด้วยครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Mon Feb 13, 2012 10:07 am
by bank9597

ผมแนบไฟล์มาให้แล้วครับ ขออภัยด้วยครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Mon Feb 13, 2012 12:59 pm
by snasui

ลองปรับ Code เป็นตามด้านล่างครับ
Code: Select all
Sub FilterDataAll()
'On Error Resume Next
Dim rSource As Range
'Application.EnableEvents = False
With Sheets("Report")
If .Range("A8") <> "" Then
.Range("A8", .Range("D" & Rows.Count).End(xlUp)).ClearContents
End If
End With
With Sheets("TaxInvoice")
Set rSource = .Range("B2", .Range("H" & Rows.Count) _
.End(xlUp))
End With
rSource.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Sheets("Report").Range("K1:M2")
rSource.Resize(, 4).SpecialCells(xlCellTypeVisible).Copy
Sheets("Report").Range("A8").PasteSpecial xlPasteValues
Sheets("TaxInvoice").ShowAllData
'Application.EnableEvents = True
End Sub
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Mon Feb 13, 2012 1:24 pm
by bank9597

สวัสดีตอนบ่ายครับ อาจารย์ ผมได้ลองโค๊ดแล้ว ผลปรากฏว่าแสดงผลได้ดีเยี่ยม รวดเร็วมากถึงแม้ข้อมูลจะเยอะก็ตาม
ขอบคุณอาจารย์ที่ช่วยชี้แนะครับ ผมจะเอาในส่วนนี้ไว้เป็นต้นแบบในการทำงานชิ้นต่อไปครับ
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 17, 2012 12:27 pm
by bank9597

อาจารย์ครับ ขอถามเพิ่มเติมต่อยอดหน่อยครับ พอดีผมได้ทำการ Filter ข้อมูลมาแสดง โดยวางตามคอลัมน์ตามที่เรากำหนด ไม่ได้เรียงไปตามลำดับเหมือนในฐานข้อมูล
ในชีท Report ผมต้องการดึงข้อมูล "หน่วยงาน" มาแสดงในคอลัมน์ G ผมได้ปรับโค๊ดหน่อยนึง มันแสดงมาแค่หัวคอลัมน์ ไม่ทราบว่าเพราะอะไร รบกวนอาจารย์ดูให้หน่อยครับ
โมดูลชื่อ Report_1 ครับ
ขอบคุณครับ

Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Fri Feb 17, 2012 5:48 pm
by snasui

ลองดูตัวอย่างการปรับ Code ตามด้านล่างครับ
Code: Select all
Sub FilterDataAll()
'On Error Resume Next
Dim rSource As Range
'Application.EnableEvents = False
With Sheets("Report")
If .Range("A8") <> "" Then
.Range("A8", .Range("D" & Rows.Count).End(xlUp)).ClearContents
End If
End With
With Sheets("TaxInvoice")
Set rSource = .Range("B2", .Range("H" & Rows.Count))
End With
rSource.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Sheets("Report").Range("K1:M2")
rSource.Resize(, 4).SpecialCells(xlCellTypeVisible).Copy
Sheets("Report").Range("A8").PasteSpecial xlPasteValues
rSource.Offset(, 5).Resize(, 1).SpecialCells(xlCellTypeVisible).Copy
Sheets("Report").Range("G8").PasteSpecial xlPasteValues
Sheets("TaxInvoice").ShowAllData
'Application.EnableEvents = True
End Sub
Re: การเสิร์ซหาข้อมูลแบบ 2 เงื่อนไข
Posted: Sat Feb 18, 2012 12:40 pm
by bank9597

แล้วผมจะมาแจ้งผลครับ รวมถึงถามเพิ่มเติมอีกครับ พอดีผมนำไปดัดแปลงใช้หลายอย่างเลยมีปัญหาไม่หมดง่าย อิอิ