:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
aerojen
Member
Member
Posts: 28
Joined: Thu Sep 05, 2013 12:23 am

ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#1

Post by aerojen »

อยากให้ พิมพ์เลขที่ในคอลัมน์ B3-B5 ข้อมูลจะต้องดึงมาจากชีท customer1,customer2
และดึง total เรียงจากมากสุด ไป น้อยสุด รวมถึงคอลัมน์ customer ดึงชื่อไฟล์มาใส่

ตอนนี้รันแล้วหายไปหมดคร้าบผม :flw:
Attachments
Test#1.xlsm
(67.73 KiB) Downloaded 16 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#2

Post by snasui »

aerojen wrote:ตอนนี้รันแล้วหายไปหมดคร้าบผม
:D คำที่ระบายสีไว้นั้นผิดกฎข้อ 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
aerojen
Member
Member
Posts: 28
Joined: Thu Sep 05, 2013 12:23 am

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#3

Post by aerojen »

ขอบคุณมากๆครับ ต้องขออภัยที่ทำผิดกฏห้องครับ :(
ถ้าผมอยากเพิ่มผลลัพธ์คือ อยากให้run ตามเลขที่ (คอลัมน์ B3:B5 ) โดยเอาชีท customer1และ2 มาเรียง ค่าtotal (คอลัมน์ M) จากมากสุดไปน้อยสุด จะทำได้มั้ยครับ
แล้วปัจจุบันใช้วิธีเพิ่มคอลัมน์ cutomer ในแต่ละชีท เพื่อลิ้งมาที่ชีท comparision พอจะมีวิธีที่ไม่เพิ่มคอลัมน์ แต่ดึงชื่อชีทมาใส่แทนเลยได้มั้ยครับ
Attachments
Test#1.xlsm
(68.17 KiB) Downloaded 11 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#4

Post by snasui »

:D ลองทำมาด้วยตนเองดูก่อน ติดแล้วค่อยถามกันครับ

แทนที่จะใช้การทำ Advance Filter ลงปลายทาง อาจจะทำการ Advance Filter ไปพักไว้ก่อนสักที่

การทำ Advance Filter จากข้อมูลหลายชีตมาต่อกันนั้น จะมีข้อจำกัดอย่างหนึ่งคือต้องลบค่าเดิมทิ้งไปก่อน การทำ Advance Filter แต่ละครั้งจะได้แค่ข้อมูลของครั้งนั้นๆ เท่านั้น เพราะต้องลบของเดิมทิ้งไป

หากเรานำไปพักไว้ก่อนแล้วค่อยนำค่าที่พักไว้นั้นมาเรียงต่อกันในปลายทางจะลดปัญหานี้ได้ หรือหากทำการ Loop โดย VBA โดยตรง ไม่ต้องผ่าน Advance Filter ก็สามารถทำได้

ทั้งหมดนี้รวมทั้งการเพิ่มชื่อชีตเข้ามา ต้องทำมาเองก่อน ติดแล้วค่อยถามกันครับ
aerojen
Member
Member
Posts: 28
Joined: Thu Sep 05, 2013 12:23 am

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#5

Post by aerojen »

ขอบคุณมากครับ ลองทำวน loop ดูแล้วครับ ไม่ติดปัญหาการดึงข้อมูลรวม
แต่เราจะเพิ่มเงื่อนไขการดึงข้อมูลต้องดึงตามการใส่เลขที่ในคอลัมน์ B3-B5 ยังไงครับ
อย่างเช่นพิมพ์ 54001012 (8 หลัก) หรือพิมพ์ 5400 (4หลัก) ข้อมูลก็มาตามที่กำหนดให้และเรียงค่า total คอลัมน์ L จากมากสุดไปน้อยสุดยังไง

ช่วยหน่อยครับ :thup:
Attachments
Test#1.xlsm
(72.05 KiB) Downloaded 17 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#6

Post by snasui »

:D เปลี่ยน 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 ดูก่อน ติดตรงไหนค่อยถามกันต่อครับ
aerojen
Member
Member
Posts: 28
Joined: Thu Sep 05, 2013 12:23 am

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#7

Post by aerojen »

ขอบคุณมากๆครับ ได้ผลตามที่ต้องการแล้วครับ รวมถึงทำ Macro เรียงข้อมูลได้แล้ว
แต่แปลกมากๆครับ เมื่อนำมาทำกับข้อมูลจริง ที่มีหลายๆไฟล์ต้องการดึงข้อมูลเหมือนเดิมแต่ข้อมูลนั้นที่มีทั้ง #VALUE!, #REF!,N/A ข้อมูลไม่สามารถดึงมาได้ กด run แล้วข้อมูลไม่มาเลยครับ

เนื่องจากไฟล์ใหญ่เลยแนบมาไม่ได้ เราสามารถปรับสูตรให้รองรับข้อมูลที่ใหญ่ขึ้นได้มั้ยครับ อีกนิดนึงครับ เมื่อรันแล้วขึ้นว่า Subscript out of range คืออะไรครับ :D
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#8

Post by snasui »

:D ควรตัดมาเฉพาะส่วนที่ประกอบด้วยค่า Error แทนที่จะส่งมาทั้งไฟล์นั้นครับ

Error ที่กล่าวถึงสาเหตุหนึ่งเพราะโปรแกรมหาชีตไม่พบครับ
aerojen
Member
Member
Posts: 28
Joined: Thu Sep 05, 2013 12:23 am

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#9

Post by aerojen »

อาจารย์ครับ ลองย่อไฟล์แล้วลองทำดูจากตัวอย่างจริงทำไม่ได้ครับ
ลักษณะเงื่อนไขไม่แตกต่างจากไฟล์ก่อนหน้าครับแค่เพิ่มจำนวนของข้อมูลที่ดึงมากขึ้นครับ
Attachments
Test#2.zip
(288.46 KiB) Downloaded 27 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงค่าตามเงื่อนไขและเรียงลำดับด้วย VBA

#10

Post by snasui »

:D เปลี่ยน Range(CStr(LSearchRow) & ":" & CStr(LSearchRow))(4)) เป็น Range(CStr(LSearchRow) & ":" & CStr(LSearchRow))(3)) ครับ

ควรจะศึกษาให้เข้าใจใน Code ไม่เช่นนั้นจะไม่สามารถแก้ไขเองได้แม้เป็นการแก้ไขเพียงเล็กน้อยครับ
Post Reply