Page 1 of 1
ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Fri Jun 10, 2016 11:13 pm
by aerojen
อยากให้ พิมพ์เลขที่ในคอลัมน์ B3-B5 ข้อมูลจะต้องดึงมาจากชีท customer1,customer2
และดึง total เรียงจากมากสุด ไป น้อยสุด รวมถึงคอลัมน์ customer ดึงชื่อไฟล์มาใส่
ตอนนี้รันแล้วหายไปหมดคร้าบผม

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sat Jun 11, 2016 7:09 am
by snasui
aerojen wrote:ตอนนี้รันแล้วหายไปหมดคร้าบผม

คำที่ระบายสีไว้นั้นผิดกฎข้อ 1 ระมัดระวังด้วยครับ
สำหรับการทำ Advance Filter โดยเลือกมาเฉพาะบางคอลัมน์ เราไม่สามารถเลือกคอลัมน์ที่ไม่ติดกันได้ นอกจากนี้การเลือก Criteria ก็ควรเลือกให้พอดีกับ Criteria ทั้งหมด หากคลุมเลือกเกินไปกว่านั้นข้อมูลจะออกมาทั้งหมดครับ
ตัวอย่าง Code กรณีเลือกแค่ 2 คอลัมน์
Code: Select all
Sub Macro2()
Sheets("Comparision").Range("B7:Z10000").ClearContents
Sheets("Customer1").Range("D14:E1000").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("B2:B3"), CopyToRange:=Range("B7"), Unique:=False
End Sub
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sat Jun 11, 2016 11:22 am
by aerojen
ขอบคุณมากๆครับ ต้องขออภัยที่ทำผิดกฏห้องครับ
ถ้าผมอยากเพิ่มผลลัพธ์คือ อยากให้run ตามเลขที่ (คอลัมน์ B3:B5 ) โดยเอาชีท customer1และ2 มาเรียง ค่าtotal (คอลัมน์ M) จากมากสุดไปน้อยสุด จะทำได้มั้ยครับ
แล้วปัจจุบันใช้วิธีเพิ่มคอลัมน์ cutomer ในแต่ละชีท เพื่อลิ้งมาที่ชีท comparision พอจะมีวิธีที่ไม่เพิ่มคอลัมน์ แต่ดึงชื่อชีทมาใส่แทนเลยได้มั้ยครับ
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sat Jun 11, 2016 11:42 am
by snasui

ลองทำมาด้วยตนเองดูก่อน ติดแล้วค่อยถามกันครับ
แทนที่จะใช้การทำ Advance Filter ลงปลายทาง อาจจะทำการ Advance Filter ไปพักไว้ก่อนสักที่
การทำ Advance Filter จากข้อมูลหลายชีตมาต่อกันนั้น จะมีข้อจำกัดอย่างหนึ่งคือต้องลบค่าเดิมทิ้งไปก่อน การทำ Advance Filter แต่ละครั้งจะได้แค่ข้อมูลของครั้งนั้นๆ เท่านั้น เพราะต้องลบของเดิมทิ้งไป
หากเรานำไปพักไว้ก่อนแล้วค่อยนำค่าที่พักไว้นั้นมาเรียงต่อกันในปลายทางจะลดปัญหานี้ได้ หรือหากทำการ Loop โดย VBA โดยตรง ไม่ต้องผ่าน Advance Filter ก็สามารถทำได้
ทั้งหมดนี้รวมทั้งการเพิ่มชื่อชีตเข้ามา ต้องทำมาเองก่อน ติดแล้วค่อยถามกันครับ
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sat Jun 11, 2016 2:44 pm
by aerojen
ขอบคุณมากครับ ลองทำวน loop ดูแล้วครับ ไม่ติดปัญหาการดึงข้อมูลรวม
แต่เราจะเพิ่มเงื่อนไขการดึงข้อมูลต้องดึงตามการใส่เลขที่ในคอลัมน์ B3-B5 ยังไงครับ
อย่างเช่นพิมพ์ 54001012 (8 หลัก) หรือพิมพ์ 5400 (4หลัก) ข้อมูลก็มาตามที่กำหนดให้และเรียงค่า total คอลัมน์ L จากมากสุดไปน้อยสุดยังไง
ช่วยหน่อยครับ

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sat Jun 11, 2016 5:22 pm
by snasui

เปลี่ยน
Cells.Select
เป็น
Range("a8").Resize(1000, 100).Select
และปรับช่วง While...Wend เป็นด้านล่างครับ
Code: Select all
While Len(Range(myNum & CStr(LSearchRow)).Value) > 0
If Range(myColName & CStr(LSearchRow)).Value >= 1 And _
InStr(Sheets(summarySheet).Range("b3"), _
Range(CStr(LSearchRow) & ":" & CStr(LSearchRow))(4)) Then
Rows(CStr(LSearchRow) & ":" & CStr(LSearchRow)).Select
Selection.Copy
Sheets(summarySheet).Select
Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow)).Select
ActiveSheet.Paste
LCopyToRow = LCopyToRow + 1
Sheets(sheetArray(i)).Select
End If
LSearchRow = LSearchRow + 1
Wend
กรณีการเรียงข้อมูล ลองบันทึก Macro แล้วปรับใช้ Code ดูก่อน ติดตรงไหนค่อยถามกันต่อครับ
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sun Jun 12, 2016 4:13 am
by aerojen
ขอบคุณมากๆครับ ได้ผลตามที่ต้องการแล้วครับ รวมถึงทำ Macro เรียงข้อมูลได้แล้ว
แต่แปลกมากๆครับ เมื่อนำมาทำกับข้อมูลจริง ที่มีหลายๆไฟล์ต้องการดึงข้อมูลเหมือนเดิมแต่ข้อมูลนั้นที่มีทั้ง #VALUE!, #REF!,N/A ข้อมูลไม่สามารถดึงมาได้ กด run แล้วข้อมูลไม่มาเลยครับ
เนื่องจากไฟล์ใหญ่เลยแนบมาไม่ได้ เราสามารถปรับสูตรให้รองรับข้อมูลที่ใหญ่ขึ้นได้มั้ยครับ อีกนิดนึงครับ เมื่อรันแล้วขึ้นว่า Subscript out of range คืออะไรครับ

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sun Jun 12, 2016 6:37 am
by snasui

ควรตัดมาเฉพาะส่วนที่ประกอบด้วยค่า Error แทนที่จะส่งมาทั้งไฟล์นั้นครับ
Error ที่กล่าวถึงสาเหตุหนึ่งเพราะโปรแกรมหาชีตไม่พบครับ
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sun Jun 12, 2016 12:09 pm
by aerojen
อาจารย์ครับ ลองย่อไฟล์แล้วลองทำดูจากตัวอย่างจริงทำไม่ได้ครับ
ลักษณะเงื่อนไขไม่แตกต่างจากไฟล์ก่อนหน้าครับแค่เพิ่มจำนวนของข้อมูลที่ดึงมากขึ้นครับ
Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA
Posted: Sun Jun 12, 2016 12:23 pm
by snasui

เปลี่ยน
Range(CStr(LSearchRow) & ":" & CStr(LSearchRow))(4))
เป็น
Range(CStr(LSearchRow) & ":" & CStr(LSearchRow))(3))
ครับ
ควรจะศึกษาให้เข้าใจใน Code ไม่เช่นนั้นจะไม่สามารถแก้ไขเองได้แม้เป็นการแก้ไขเพียงเล็กน้อยครับ