ขอคำแนะนำเรื่องการ Copy ข้อมูลจากหลาย file โดยใช้ VBA

กระทู้คำถาม
สวัสดีครับ ผมตั้งกระทู้ครั้งแรก ถ้าผิดพลาดประการใดขออภัยด้วยนะครับ
ผมมีปัญญาการใช้งาน VBA มาขอความช่วยเหลือจากผู้รู้ครับ  ต้องการ copy ข้อมูลจากไฟล์อื่นโดยเลือกเฉพาะเซลล์ที่ต้องการมาวางในตารางในไฟล์หลักตามรูปแนบครับ

นี่คือรูปงานที่ต้องการ


โดยนำข้อมูลมาจากไฟล์อื่นตามรูป
- นำข้อมูลจาก B7:B11 ไปวางใน B4:B8
- นำข้อมูลจาก D7:B11 ไปวางใน C4:C8


แต่สิ่งที่ได้จากการเขียน code ตามรูปแนบครับ
- VBA มองว่าในตารางมีข้อมูลอยู่จึงวางข้อมูลต่อท้ายตารางครับ


รบกวนขอคำแนะนำหน่อยครับติดตรงนี้มาหลายอาทิตย์แล้วครับ ผมใช้ code ตามด้านล่างครับ
ขอบคุณครับ
-----------------------------------------------------------------------------------------------------------------
Sub Consolidate_data()

Dim MSF As Workbook
Dim i As Long
    For i = 5 To 7
    Set MSF = Workbooks.Open(Sh_Consolidate.Range("F" & i).Value)
    Range("B7").Select
    Range("B7", ActiveCell.End(xlDown)).Copy
    Sh_Consolidate.Range("B" & Rows.Count).End(xlUp).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    
    Range("D7").Select
    Range("D7", ActiveCell.End(xlDown)).Copy
    Sh_Consolidate.Range("C" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    
    Next i
    
End Sub
--------------------------------------------------------------------------------------------------------------------------------
แก้ไขข้อความเมื่อ
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 1
เพราะว่าคุณไปแปลงตารางปกติเป็นตารางไดนามิกส์ที่เป็นฐานข้อมูล ต้องยกเลิกก่อน

คลิกแท็บ Table Design
ไปที่กลุ่ม Tools
คลิกปุ่ม Convert To Range
ตอบ Yes

การเขียน VBA กับ Dynamic Table ต้องเขียนแบบ List Object ถ้าคุณไม่เชี่ยว อย่าเสี่ยงครับ

อีกประการหนึ่ง คุณประกาศตัวแปร

Dim MSF As Workbook

แต่คุณต้องการดึงชื่อไฟล์ที่อยู่ใน Sh_Consolidate.Range("F" & i).Value มาใช้ มันขัดแย้งกัน ต้องประกาศตัวแปรเป็น strFilename เก็บข้อมูลประเภทสายอักขระ (String) ครับ

ให้ปรับโค้ดเป็นแบบนี้

สมมติว่า Folder เก็บไฟล์ชื่อ MyProject อยู่ที่ไดรว์ D:
dim strOpenFileName (5 to 7) as String, bytFile as byte

Function FileExist(strFilename As String) As Boolean
    FileExist = (Dir(strFilename) <> "")
End Function


Sub CheckExistFile
For bytFile = 5 to 7
    strOpenFilename(bytFIle) = "D:\MyProject\"&Sh_Consolidate.Range("F" & bytFile).Value

    if fileexist(strOpenfilename(bytfile)) = false then
      msgbox "System will terminated process because file name : " &"'" & srfilename(bytfile) &"'" &" was not found!",vbokonly+vbinformation
        end
    end if
    next bytFile
else
    ConsolidationData
end if

end sub

Sub ConsolidationData
    Dim strSoureFilename as String
    Application.ScreenUpdating = False
    For bytFile = 5 To 7
        strSourceFilename = "D:\MyProject\&Sh_Consolidate.Range("F" & bytFile).Value
        Workbooks.Open Filename:= strSourceFilename
      
        Range("B7", Range("B1048576").End(xlUp)).Copy
        'Workbooks(1) คือไฟล์ปลายทาง
        workbooks(1).activate
        Sh_Consolidate.Range("B1048576").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
        workbooks(2).activate
        Range("D7", Range("D1048576").End(xlUp)).Copy
        workbooks(1).activate
        Sh_Consolidate.Range("C1048576").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        'Workbooks(2) คือ File แหล่งข้อมูล
        workbooks(2).close false
    Next bytFile
    Msgbox "Consolidation process is completed!",vbokonly
    Application.ScreenUpdating = True
End Sub
ไม่เข้าใจถามได้

บ้านฟ้า : กลุ่มแฟนพันธุ์แท้เอ็กเซล
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่