Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> Office

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

เมื่อเราต้องจัดการกับหลายแผ่น Excel บางครั้งเราต้องคัดลอกข้อมูลจากแผ่นคำนวณหนึ่งไปอีกแผ่นหนึ่งพร้อมเงื่อนไขบางอย่างเพื่อความอ่านที่ดีขึ้น การใช้ VBA เป็นวิธีที่มีประสิทธิภาพ ที่รวดเร็วที่สุด และปลอดภัยที่สุดในการดำเนินการใดๆ ใน Excel ในบทความนี้ เราจะแสดงวิธี คัดลอกข้อมูลไปอีกแผ่นด้วย Advanced Filter ใน Excel ด้วย VBA macro

ดาวน์โหลดสมุดทำงาน (Download Workbook)

คุณสามารถดาวน์โหลดสมุดทำงาน Excel ฝึกปฏิบัติฟรีได้จากที่นี่

3 วิธี ใช้ VBA คัดลอกข้อมูลไปอีกแผ่นพร้อม Advanced Filter ใน Excel

ดูชุดข้อมูลต่อไปนี้ มีแผ่นงาน Excel ชื่อ Original แผ่นนี้ประกอบด้วยข้อมูลบางส่วนจากช่วง B4 ถึง E12 ช่วงนั้นยังมีค่าซ้ำ ช่วง G4 ถึง H5 เก็บ เกณฑ์ (criteria) สิ่งที่เราต้องการคือ เราจะคัดลอกข้อมูลจากช่วง B5:E12 เมื่อ John จากคอลัมน์ Name (ชื่อ) มี Marks (คะแนน) น้อยกว่า 80 (เกณฑ์ใน เซลล์ G4:H5) และวางข้อมูลเฉพาะนั้นไปแผ่นอื่นด้วย Advanced Filter ใน Excel ด้วย 3 วิธีที่แตกต่างกัน

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

เราจะดูวิธี แทรกแมโครแบบฮาร์ดโค้ดเพื่อคัดลอกข้อมูล, วิธี advanced filter โดยการเลือก (advance filter by selection) และวิธี โอนข้อมูลจากแผ่นหนึ่งไปอีกแผ่นโดยการบันทึกแมโคร (recording the macro) และชุดข้อมูลข้างต้นจะเป็นตัวอย่างสำหรับรันทุกวิธีที่กล่าวมา

1. แทรกโค้ด VBA คัดลอกข้อมูลไปอีกแผ่นพร้อม Advanced Filter ใน Excel

ที่นี่ คุณจะได้เรียนรู้ โค้ด VBA เพื่อ คัดลอกข้อมูลเฉพาะจากแผ่น Original เมื่อคะแนนของ John น้อยกว่า 80 ไปอีก แผ่นชื่อ Target ด้วย advanced filter

ขั้นตอน:

  1. ก่อนอื่น กด Alt + F11 บนคีย์บอร์ด หรือไปที่แท็บ Developer -> Visual Basic เพื่อเปิด Visual Basic Editor

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ต่อไป ในหน้าต่างโค้ดที่ป๊อปอัพ จากแถบเมนู คลิก Insert -> Module

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ก็อปปี้โค้ดต่อไปนี้และวางในหน้าต่างโค้ด
Sub AdvancedFilterCode() 
Dim iRange As Range 
Dim iCriteria As Range 
'set the range to filter and the criteria range 
Set iRange = Sheets("Original").Range("B4:E12") 
Set iCriteria = Sheets("Original").Range("G4:H5") 
'copy the filtered data to the destination 
iRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=iCriteria, CopyToRange:=Sheets("Target").Range("B4:E4"), Unique:=True 
End Sub

โค้ดของคุณพร้อมรันแล้ว

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. กด F5 บนคีย์บอร์ด หรือจากแถบเมนูเลือก Run -> Run Sub/UserForm คุณยังสามารถคลิกไอคอน Run เล็กๆ ในแถบเมนูย่อยเพื่อรันแมโครได้

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

หลังจากรันโค้ดแล้ว ดูภาพด้านล่างเพื่อดูผลลัพธ์

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

ผลลัพธ์ คือ ข้อมูลที่ คะแนนของ John น้อยกว่า 80 เท่านั้น ถูก คัดลอก ใน แผ่น Target จากแผ่น Original ด้วย Advanced Filter ของ VBA

อ่านเพิ่มเติม: วิธีใช้ Advanced Filter คัดลอกข้อมูลไปแผ่นงานอื่นใน Excel

2. ใช้ VBA Macro กรองข้อมูลโดยการเลือกของผู้ใช้ (User-Defined Selection)

ตอนนี้ คุณจะได้เรียนรู้วิธี กรองข้อมูลเฉพาะจากแผ่น Original เมื่อ คะแนนของ John น้อยกว่า 80 ไปอีก แผ่นชื่อ Destination จาก ช่วงที่ผู้ใช้เลือก (user-selected range) ด้วย advanced filter ของ VBA ใน Excel

ขั้นตอน:

  1. เปิด Visual Basic Editor จากแท็บ Developer และ Insert Module ในหน้าต่างโค้ด เช่นเดียวกับก่อนหน้า
  2. ในหน้าต่างโค้ด ก็อปปี้โค้ดต่อไปนี้และวาง
Sub AdvancedFilterBySelection() 
Dim iTrgt As String 
Dim iRange As Range 
Dim iCriteria As Range 
Dim iDestination As Range 
On Error Resume Next 
iTrgt = ActiveWindow.RangeSelection.Address 
Set iRange = Application.InputBox("Select Range to Filter", "Excel", iTrgt, , , , , 8) 
If iRange Is Nothing Then Exit Sub 
Set iCriteria = Application.InputBox("Select Criteria Range", "Excel", "", , , , , 8) 
If iCriteria Is Nothing Then Exit Sub 
Set iDestination = Application.InputBox("Select Destination Range", "Excel", "", , , , , 8) 
If iDestination Is Nothing Then Exit Sub 
iRange.AdvancedFilter xlFilterCopy, iCriteria, iDestination, False 
iDestination.Worksheet.Activate 
iDestination.Worksheet.Columns.AutoFit 
End Sub

โค้ดของคุณพร้อมรันแล้ว

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. Run (รัน) แมโคร
  2. กล่องป๊อปอัพจะปรากฏ เลือกช่วง ที่คุณต้องการ กรอง (ในกรณีนี้ คือช่วง B4 ถึง E12)
  3. กด OK

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. กล่องป๊อปอัพอีกอันจะปรากฏ ครั้งนี้คุณต้อง เลือกช่วงเกณฑ์ ที่คุณเก็บไว้ในชุดข้อมูล (ช่วงเกณฑ์จาก เซลล์ G4 ถึง H5 สำหรับชุดข้อมูลของเรา)
  2. กด OK อีกครั้ง

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ครั้งสุดท้าย อีกกล่องป๊อปอัพจะปรากฏ และตอนนี้ คุณต้อง เลือกช่วงปลายทาง (destination range) ที่คุณต้องการ เก็บข้อมูลที่คัดลอก ในกรณีนี้ คือ เซลล์ B2 ใน แผ่น Destination
  2. กด OK

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

ดูผลลัพธ์จากภาพด้านล่าง

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

สุดท้าย ข้อมูลที่ คะแนนของ John น้อยกว่า 80 เท่านั้น ถูก คัดลอก ใน แผ่น Destination จากแผ่น Original ด้วย Advanced Filter ของ VBA

เนื้อหาที่เกี่ยวข้อง: Excel Advanced Filter Not Working (2 เหตุผล & วิธีแก้)

การอ่านที่คล้ายคลึงกัน

  • วิธีใช้ Advanced Filter หาก Criteria Range มีข้อความใน Excel
  • Dynamic Advanced Filter Excel (VBA & Macro)
  • Advanced Filter พร้อม Criteria Range ใน Excel (18 การประยุกต์ใช้)
  • Advanced Filter พร้อมหลายเกณฑ์ใน Excel (15 ตัวอย่างที่เหมาะสม)
  • ตัวอย่าง Excel VBA: ใช้ Advanced Filter พร้อมเกณฑ์ (6 เกณฑ์)

3. ใช้ VBA Macro คัดลอกข้อมูลไปอีกแผ่นโดยการบันทึกแมโคร (Macro Recording) ใน Excel

ในส่วนนี้ คุณจะได้รู้วิธีแก้ปัญหาเดียวกัน คือ ดึงข้อมูลเฉพาะจากแผ่น Original เมื่อคะแนนของ John น้อยกว่า 80 ไปอีก แผ่นชื่อ Filtered โดย การบันทึกแมโคร (Macro recording) ของ VBA ใน Excel

ขั้นตอน:

  1. เปิด แผ่นงานใหม่ (ในกรณีนี้ คือแผ่น Filtered)
  2. ในแผ่นนั้น เก็บเฉพาะแถวหัวข้อ (header row) ของชุดข้อมูลเดิม

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ไปที่แผ่น Original จะเห็นเครื่องหมาย แมโครเล็กๆ ที่มุมซ้ายล่างของแผ่น คลิกเครื่องหมายนั้น เพื่อเริ่มบันทึกแมโคร

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. หน้าต่าง Record Macro ป๊อปอัพ จะปรากฏ ให้ ชื่อแมโคร (Macro name) ที่ต้องการ เราตั้ง AdvancedFilter เป็น ชื่อแมโคร
  2. เลือกที่ต้องการ เก็บแมโคร เราต้องการเก็บในสมุดทำงานที่มีอยู่ จึงเลือก This Workbook
  3. คลิก OK

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. กลับไปที่แผ่น Original จะสังเกตว่าแมโครที่เริ่มต้นบันทึกอยู่

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ไปที่ แผ่นงาน ที่จะ เก็บข้อมูลที่คัดลอก (เช่น แผ่น Filtered)
  2. มีเซลล์ที่ใช้งานอยู่ (active cell) ในแผ่นนั้น และไปที่ Data -> Advanced

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. กล่อง Advanced Filter ป๊อปอัพ จะปรากฏ
  2. ขั้นแรก ติ๊กถูก ตัวเลือก Copy to another location จาก Action
  3. ในกล่องข้อความข้าง List range ไปที่แผ่น Original และ เลือกช่วง ที่จะกรอง (สำหรับชุดข้อมูลของเรา ช่วงคือ B4:E12)

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ในกล่องข้อความข้าง Criteria range เลือก ช่วงเกณฑ์ (คะแนนของ John น้อยกว่า 80) ที่เก็บใน แผ่น Original (สำหรับชุดข้อมูลของเรา ช่วงคือ G4:H5)

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ในกล่องข้อความข้าง Copy to ไปที่แผ่น Filtered แผ่นที่ต้องการ เก็บข้อมูลที่คัดลอก และ เลือกช่วงหัวข้อ (header range) (สำหรับชุดข้อมูลของเรา ช่วงคือ B4:E4)
  2. สุดท้าย คลิก OK

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

ดูผลลัพธ์จากกระบวนการทั้งหมดจากภาพด้านล่าง เฉพาะข้อมูล ที่ คะแนนของ John น้อยกว่า 80 ถูก คัดลอก ใน แผ่น Filtered จากแผ่น Original ด้วย การบันทึกแมโคร

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ตอนนี้ คลิกเครื่องหมายแมโคร ที่มุมซ้ายล่างของแผ่น เพื่อหยุดการบันทึกแมโคร ตอนนี้คุณมีแมโครที่บันทึกไว้ ซึ่งจะดำเนินการขั้นตอนที่อธิบายข้างต้นทุกครั้งที่คุณรัน

แต่วิธีนี้มี ข้อเสีย หากคุณเพิ่มข้อมูลใหม่ในแผ่น Original แผ่น Filtered จะ ไม่ได้รับการอัปเดต แม้ข้อมูลจะตรงตามเกณฑ์

เราต้องการให้แผ่น Filtered ใหม่ของเราถูกอัปเดตอัตโนมัติโดยการรันโค้ดเมื่อเพิ่มข้อมูลใหม่ในแผ่น Original เพื่อทำเช่นนั้น เราต้องปรับโค้ดเล็กน้อย

ทุกขั้นตอนเพื่อให้ได้สิ่งที่เราต้องการ แสดงด้านล่าง

ขั้นตอน:

  1. ก่อนอื่น จากแท็บ เลือก View -> Macros -> View Macros

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. หน้าต่าง Macro ป๊อปอัพ จะปรากฏ เลือก ชื่อแมโคร (Macro name) ที่คุณเพิ่ง สร้างโดยการบันทึก (AdvancedFilter สำหรับกรณีของเรา)
  2. คลิก Edit (แก้ไข)

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. โค้ดเบื้องหลังแมโครที่บันทึกจะปรากฏในหน้าต่างโค้ด (ดูภาพด้านล่าง)

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ลบส่วนที่ทำเครื่องหมายสีน้ำเงิน (แสดงในภาพด้านล่าง) ออกจากโค้ด

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ปรับโค้ด ตามภาพต่อไปนี้

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. ตอนนี้ โค้ดที่อัปเดตแล้ว จะเป็น:
Sub AdvancedFilter() 
Sheets("Original").Range("B4").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Original").Range("G4:H5"), CopyToRange:=Sheets("Filtered").Range("B4:E4"), Unique:=False 
End Sub
  1. Save (บันทึก) โค้ดนี้
  2. กลับไปที่แผ่น Original และ เพิ่มข้อมูลใหม่ ที่ตรงตามเกณฑ์ ตัวอย่างเช่น เพิ่มแถวอีกแถวของข้อมูล John ที่ คะแนนคือ 76 ซึ่งตรงตามเกณฑ์ คะแนนน้อยกว่า 80

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. จากนั้น Run (รัน) โค้ด และดูภาพต่อไปนี้สำหรับผลลัพธ์

เชี่ยวชาญ VBA: คัดลอกข้อมูลที่กรองแล้วระหว่างแผ่น Excel อย่างรวดเร็วและปลอดภัย

  1. มี แถวที่คัดลอกใหม่ ใน แผ่น Filtered ของข้อมูล John ด้วย คะแนน 76 ที่ตรงตามเกณฑ์ (Marks<80)

อ่านเพิ่มเติม: วิธีใช้ Advanced Filter สำหรับบันทึกที่ไม่ซ้ำ (Unique Records Only) ใน Excel

สรุป

สรุปได้ว่า บทความนี้แสดง 3 วิธีที่แตกต่างกันในการ คัดลอกข้อมูลไปอีกแผ่นด้วย advanced filter ใน Excel ด้วย VBA macro หวังว่าบทความนี้จะเป็นประโยชน์มาก รู้สึกสบายๆ ถามคำถามเกี่ยวกับหัวข้อนี้ได้เลย

บทความที่เกี่ยวข้อง

  • วิธีใช้ Advanced Filter ตัดเซลล์ว่างใน Excel (3 เทคนิคง่าย)
  • Excel VBA: Advanced Filter พร้อมเกณฑ์หลายอย่างในช่วง (5 วิธี)
  • วิธีใช้ Advanced Filter สำหรับบันทึกที่ไม่ซ้ำ (Unique Records Only) ใน Excel
  • ใช้ Advanced Filter คัดลอกไปตำแหน่งอื่นใน Excel
  • Excel Advanced Filter: ใช้ "Does Not Contain" (2 วิธี)
  • ใช้ Advanced Filter ตามเกณฑ์หลายอย่างในคอลัมน์เดียวใน Excel