การรวมข้อมูลจากหลายไฟล์ด้วย VBA

📝 งานที่สำคัญอย่างหนึ่งสำหรับการทำรายงานคือการรวมข้อมูลจากหลาย ๆ ไฟล์ งานลักษณะนี้เกิดจากการที่องค์กรมีหน่วยงานอยู่หลายสาขาหรือหลายหน่วยงานแล้วจำเป็นต้องนำข้อมูลมารวมกันเพื่อทำรายงาน หากเป็นการรวมข้อมูลจากหลาย ๆ ไฟล์ด้วยมือนั้น เป็นการสิ้นเปลืองเวลาไปอย่างมากเพื่อให้ได้ข้อมูลครบถ้วน 🎯

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 สรุป: ได้ระบบรวมข้อมูลจากหลายไฟล์ที่แม่นยำและประหยัดเวลา
Scroll to Top