📝 งานที่สำคัญอย่างหนึ่งสำหรับการทำรายงานคือการรวมข้อมูลจากหลาย ๆ ไฟล์ งานลักษณะนี้เกิดจากการที่องค์กรมีหน่วยงานอยู่หลายสาขาหรือหลายหน่วยงานแล้วจำเป็นต้องนำข้อมูลมารวมกันเพื่อทำรายงาน หากเป็นการรวมข้อมูลจากหลาย ๆ ไฟล์ด้วยมือนั้น เป็นการสิ้นเปลืองเวลาไปอย่างมากเพื่อให้ได้ข้อมูลครบถ้วน 🎯
Video ด้านล่างนี้เป็นการนำ VBA เข้ามาช่วยสำหรับการรวมข้อมูลจากหลายไฟล์ หลายชีต มาไว้ในชีตใดชีตหนึ่งด้วยความถูกต้อง รวดเร็ว เพื่อลดเวลาในการรวบรวมข้อมูล สามารถรวมซ้ำได้หากพบว่ามีข้อมูลเข้ามาใหม่ ซึ่งจะทำการลบข้อมูลเดิมทิ้งก่อนแล้ววางด้วยข้อมูลใหม่ จะลดเวลาในการรวมข้อมูลได้อย่างมหาศาล เหมาะสำหรับผู้ใช้งานที่มีความรู้เกี่ยวกับ VBA ที่จะสามารถแก้ไข ปรับปรุง เปลี่ยนแปลง เพิ่มเติมเพื่อขยายความสามารถของโปรแกรมให้ครอบคลุมงานที่ตนเองรับผิดชอบได้ โดยมีตัวอย่าง Code ตามด้านล่างครับ ⤵
Sub CollectDataFromMultipleFiles() Dim wb As Workbook, s As Worksheet, db As Worksheet Dim strPath As Variant, i As Integer, f As Byte strPath = Application.GetOpenFilename( _ FileFilter:="Excel File (*.xls*),*.xls*", _ MultiSelect:=True) If TypeName(strPath) = "Boolean" Then Exit Sub Set db = ThisWorkbook.Sheets(1) db.UsedRange.ClearContents Application.ScreenUpdating = False For i = 1 To UBound(strPath) For Each s In wb.Worksheets f = IIf(db.Range("a1").Value = "", 1, 0) If s.Range("a1").Value <> "" Then s.UsedRange.Offset(f, 0).Copy With db .Range("a" & .Rows.Count).End(xlUp).Offset(f, 0) _ .PasteSpecial xlPasteValues End With End If Next s wb.Close Application.CutCopyMode = False Next i Application.ScreenUpdating = True MsgBox "Finished", vbInformation End Sub
📹 Video แสดงการรวมข้อมูลจากหลายไฟล์ หลายชีต มาไว้ในชีตเดียว
🧭 Timeline
- 00:00:14 แนะนำวัตถุประสงค์: รวมข้อมูลจากหลายไฟล์และหลายชีตใน Excel
- 00:00:39 เปิด VBE และสร้าง Module ใหม่
- 00:01:04 ตั้งชื่อ Procedure ว่า Collect_Data
- 00:01:20 ประกาศตัวแปร เช่น wb, s, db, StringPart, f, i
- 00:01:45 ใช้ Application.GetOpenFilename เพื่อให้ผู้ใช้เลือกหลายไฟล์
- 00:03:46 ตรวจสอบว่ามีการเลือกไฟล์ก่อนดำเนินการต่อ
- 00:04:10 เคลียร์ข้อมูลเก่าในชีตปลายทาง (DB) ด้วย .UsedRange.ClearContents
- 00:05:02 ปิดการอัปเดตหน้าจอชั่วคราวเพื่อเพิ่มประสิทธิภาพ
- 00:05:44 เริ่ม Loop เข้าแต่ละไฟล์ที่เลือกด้วย Workbooks.Open
- 00:06:30 Loop เข้าแต่ละชีตในไฟล์นั้น
- 00:07:00 ตรวจสอบว่าชีตมีข้อมูลหรือไม่
- 00:07:30 ถ้ายังไม่มีข้อมูลในชีต DB → คัดลอกหัวคอลัมน์
- 00:08:11 คัดลอกข้อมูลจากชีตต้นทางแล้ววางต่อกันในชีต DB
- 00:10:09 ปิดไฟล์ต้นทางโดยไม่เซฟ (wb.Close False)
- 00:10:35 ยกเลิก Copy Mode และคืนค่าการอัปเดตหน้าจอ
- 00:11:10 แจ้งผู้ใช้ด้วย MsgBox ว่าเสร็จสิ้น
- 00:11:53 ทดสอบการรันโค้ดและตรวจสอบผลลัพธ์
- 00:12:10 สรุป: ได้ระบบรวมข้อมูลจากหลายไฟล์ที่แม่นยำและประหยัดเวลา