คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 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:
บ้านฟ้า : กลุ่มแฟนพันธุ์แท้เอ็กเซล
คลิกแท็บ 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
ไม่เข้าใจถามได้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
บ้านฟ้า : กลุ่มแฟนพันธุ์แท้เอ็กเซล
แสดงความคิดเห็น
ขอคำแนะนำเรื่องการ 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
--------------------------------------------------------------------------------------------------------------------------------