:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

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

ฟอรัมถาม-ตอบปัญหาการใช้งานสูตรและฟังก์ชัน Excel
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#1

Post by pro602 »

เรียนอาจารย์และพี่ๆเพื่อนๆสมาชิก
ผมลองนำ VBA Code ของอาจารย์มาใช้รวมข้อมูลจากหลายๆไฟล์แล้วขึ้น Eror ตามภาพตัวอย่างครับ โดยในแต่ล่ะ File จะมีอยู่หลายชีทแต่ต้องการข้อมูลจากชีทที่ชื่อ ColecData ของแต่ล่ะ File เท่านั้นมารวมกัน ช่วยแนะนำจุดที่ต้องปรับ 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
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 31255
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#2

Post by snasui »

:D กรุณาโพสต์ Code มาใหม่ให้มีรูปแบบที่เป็นไปตามกฎการใช้บอร์ดข้อ 5 ด้านบนพร้อมทั้งแนบไฟล์ Excel ที่เกิดปัญหานั้นมาด้วยครับ :roll:
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#3

Post by pro602 »

snasui wrote: Mon Jun 08, 2020 7:14 pm :D กรุณาโพสต์ Code มาใหม่ให้มีรูปแบบที่เป็นไปตามกฎการใช้บอร์ดข้อ 5 ด้านบนพร้อมทั้งแนบไฟล์ Excel ที่เกิดปัญหานั้นมาด้วยครับ :roll:
ต้องการดึงข้อมูลA-E จากชีท CollecData ของแต่ล่ะไฟล์มารวมกันครับ ผมลองนำ Code ของอาจารย์มาลองใช้งานตอนรันขึ้น Run- time error 91 ครับ....File ที่ผมจะใช้รวมมันแนบมาไม่ได้ครับตอนแนบไฟล์มันขึ้นสถานะ "ลบ" code ที่ผมใช้ตามด้านล่างครับ file ข้อมูลตามที่แนบครับ

Code: Select all

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
You do not have the required permissions to view the files attached to this post.
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#4

Post by pro602 »

pro602 wrote: Mon Jun 08, 2020 9:50 pm
snasui wrote: Mon Jun 08, 2020 7:14 pm :D กรุณาโพสต์ Code มาใหม่ให้มีรูปแบบที่เป็นไปตามกฎการใช้บอร์ดข้อ 5 ด้านบนพร้อมทั้งแนบไฟล์ Excel ที่เกิดปัญหานั้นมาด้วยครับ :roll:
ต้องการดึงข้อมูลA-E จากชีท CollecData ของแต่ล่ะไฟล์มารวมกันครับ ผมลองนำ Code ของอาจารย์มาลองใช้งานตอนรันขึ้น Run- time error 91 ครับ....File ที่ผมจะใช้รวมมันแนบมาไม่ได้ครับตอนแนบไฟล์มันขึ้นสถานะ "ลบ" code ที่ผมใช้ตามด้านล่างครับ file ข้อมูลตามที่แนบครับ

Code: Select all

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
file สำหรับรวมข้อมูลครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 31255
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#5

Post by snasui »

:D เขียน Code ไม่ครบครับ

ดูที่ผมทำสัญญลักษณ์ไว้ในภาพ และจำเป็นต้องตรวจสอบ Code ใหม่ในทุกบรรทัดให้ตรงกับในภาพครับ

You do not have the required permissions to view the files attached to this post.
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#6

Post by pro602 »

snasui wrote: Mon Jun 08, 2020 11:06 pm :D เขียน Code ไม่ครบครับ

ดูที่ผมทำสัญญลักษณ์ไว้ในภาพ และจำเป็นต้องตรวจสอบ Code ใหม่ในทุกบรรทัดให้ตรงกับในภาพครับ

หลังจากที่ผมได้ปรับCode ตามที่อาจารย์แนะนำแล้วทดลองรันผลข้อมูลที่ดึงมาจะได้ข้อมูลจากทุกชีทของFile มาเพียงแค่ Fileเดียวครับ(ระหว่างรันโปรแกรมมีข้อความขึ้นตามรูปที่แนบครับ) ไม่มาทุกFile
ผมต้องปรับCode ตรงจุดไหนครับเพื่อให้ข้อมูลที่ดึงมารวมกัน เอาเฉพาะข้อมูลจากชีท CollecData ของทุกFile
Code ที่ปรับแล้วตามที่อาจารย์แนะนำให้ไปตรวจสอบเพิ่มเติม

Code: Select all

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)
         Set wb = Workbooks.Open(strPath(1))
        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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    MsgBox "Finished", vbInformation
End Sub
You do not have the required permissions to view the files attached to this post.
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#7

Post by puriwutpokin »

pro602 wrote: Tue Jun 09, 2020 6:36 am
snasui wrote: Mon Jun 08, 2020 11:06 pm :D เขียน Code ไม่ครบครับ

ดูที่ผมทำสัญญลักษณ์ไว้ในภาพ และจำเป็นต้องตรวจสอบ Code ใหม่ในทุกบรรทัดให้ตรงกับในภาพครับ

หลังจากที่ผมได้ปรับCode ตามที่อาจารย์แนะนำแล้วทดลองรันผลข้อมูลที่ดึงมาจะได้ข้อมูลจากทุกชีทของFile มาเพียงแค่ Fileเดียวครับ(ระหว่างรันโปรแกรมมีข้อความขึ้นตามรูปที่แนบครับ) ไม่มาทุกFile
ผมต้องปรับCode ตรงจุดไหนครับเพื่อให้ข้อมูลที่ดึงมารวมกัน เอาเฉพาะข้อมูลจากชีท CollecData ของทุกFile
Code ที่ปรับแล้วตามที่อาจารย์แนะนำให้ไปตรวจสอบเพิ่มเติม

Code: Select all

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)
         Set wb = Workbooks.Open(strPath(1))
        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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    MsgBox "Finished", vbInformation
End Sub

Code: Select all

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)
         Set wb = Workbooks.Open(strPath(i)) '<<<ตรงนี้เปลี่ยนเป็น i ตามอาจารย์แจ้งครับ
        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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    MsgBox "Finished", vbInformation
End Sub
:shock: :roll: :D
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#8

Post by pro602 »

Code: Select all

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)
         Set wb = Workbooks.Open(strPath(i))
        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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    MsgBox "Finished", vbInformation
End Sub
[/quote]
ผมก็๋ลองเปลี่ยนเป็น i ไปแล้วครับ ผลที่ได้ก็คือจะมีข้อมูลมาจากทุกชีทของ File Line 4 เพียง File เดียวครับ (ตามที่ผมแนบ Fileมาในตอนต้น Line4,Line5,Line6)
จากปัญหาที่เกิดขึ้นผมต้องปรับ Code ตรงจุดไหนเพิ่มเติมครับเพื่อให้ได้ข้อมูลที่มาจากชีท CollecData ของทุก File มารวมต่อกันครับ...
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#9

Post by puriwutpokin »

ลองปรับตามนี้ แต่ไฟล์ต้นทาง ต้องตัดค่าบรรทัดที่มีค่าว่างออกด้วย ไม่นั้นข้อมูลจะต่อกันห่างกันครับ

Code: Select all

Sub CollectDataFromMultipleFiles()
    Dim wb As Workbook, s As Worksheet, db As Worksheet
    Dim strPath As Variant, i As Integer, f As Byte
    Application.DisplayAlerts = False
    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)
         Set wb = Workbooks.Open(strPath(i))
     '   For Each s In wb.Worksheets
         Set s = wb.Sheets("CollecData")
            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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Finished", vbInformation
End Sub
:shock: :roll: :D
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#10

Post by pro602 »

puriwutpokin wrote: Tue Jun 09, 2020 2:21 pm ลองปรับตามนี้ แต่ไฟล์ต้นทาง ต้องตัดค่าบรรทัดที่มีค่าว่างออกด้วย ไม่นั้นข้อมูลจะต่อกันห่างกันครับ

Code: Select all

Sub CollectDataFromMultipleFiles()
    Dim wb As Workbook, s As Worksheet, db As Worksheet
    Dim strPath As Variant, i As Integer, f As Byte
    Application.DisplayAlerts = False
    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)
         Set wb = Workbooks.Open(strPath(i))
     '   For Each s In wb.Worksheets
         Set s = wb.Sheets("CollecData")
            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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Finished", vbInformation
End Sub
ขอบคุณครับสำหรับแนวทาง Code หลังจากที่ผมได้ทดลองนำมาใช้รันโปรแกรม สามารถดึงข้อมูลมาจาก Sheet CollecData เพียงชีทเดียวตามที่ต้องการครับแต่จะได้ข้อมูลเพียงแค่ไฟล์เดียวอยู่ครับ น่าจะเกิดจากการวางทับที่เดิมเราจะปรับให้วิ่งไปวางต่อที่ Row สุดท้ายตรงไหนครับ
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#11

Post by puriwutpokin »

pro602 wrote: Tue Jun 09, 2020 4:56 pm
puriwutpokin wrote: Tue Jun 09, 2020 2:21 pm ลองปรับตามนี้ แต่ไฟล์ต้นทาง ต้องตัดค่าบรรทัดที่มีค่าว่างออกด้วย ไม่นั้นข้อมูลจะต่อกันห่างกันครับ

Code: Select all

Sub CollectDataFromMultipleFiles()
    Dim wb As Workbook, s As Worksheet, db As Worksheet
    Dim strPath As Variant, i As Integer, f As Byte
    Application.DisplayAlerts = False
    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)
         Set wb = Workbooks.Open(strPath(i))
     '   For Each s In wb.Worksheets
         Set s = wb.Sheets("CollecData")
            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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Finished", vbInformation
End Sub
ขอบคุณครับสำหรับแนวทาง Code หลังจากที่ผมได้ทดลองนำมาใช้รันโปรแกรม สามารถดึงข้อมูลมาจาก Sheet CollecData เพียงชีทเดียวตามที่ต้องการครับแต่จะได้ข้อมูลเพียงแค่ไฟล์เดียวอยู่ครับ น่าจะเกิดจากการวางทับที่เดิมเราจะปรับให้วิ่งไปวางต่อที่ Row สุดท้ายตรงไหนครับ
ที่ไฟล์ที่ดึงค่ามา ใช้​ UsedRange​ ทำให้เอาค่าว่างที่มีค่าแอบแฝงมาด้วยครับ​ลองลบบรรทัด​ไฟล์ต้นทางแถวสุดท้ายลงโดยกด Ctrl​+Shift​+ลูกศร​ชี้ลง​แล้วกดลบแถวดูครับ​ไปทั้งสามไฟล์แล้วรันใหม่ดูครับ​
:shock: :roll: :D
pro602
Member
Member
Posts: 140
Joined: Sat Feb 06, 2016 9:58 am
Excel Ver: 2007,2010

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

#12

Post by pro602 »

puriwutpokin wrote: Tue Jun 09, 2020 5:18 pm
pro602 wrote: Tue Jun 09, 2020 4:56 pm
puriwutpokin wrote: Tue Jun 09, 2020 2:21 pm ลองปรับตามนี้ แต่ไฟล์ต้นทาง ต้องตัดค่าบรรทัดที่มีค่าว่างออกด้วย ไม่นั้นข้อมูลจะต่อกันห่างกันครับ

Code: Select all

Sub CollectDataFromMultipleFiles()
    Dim wb As Workbook, s As Worksheet, db As Worksheet
    Dim strPath As Variant, i As Integer, f As Byte
    Application.DisplayAlerts = False
    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)
         Set wb = Workbooks.Open(strPath(i))
     '   For Each s In wb.Worksheets
         Set s = wb.Sheets("CollecData")
            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 False
        Application.CutCopyMode = False
    Next i
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Finished", vbInformation
End Sub
ขอบคุณครับสำหรับแนวทาง Code หลังจากที่ผมได้ทดลองนำมาใช้รันโปรแกรม สามารถดึงข้อมูลมาจาก Sheet CollecData เพียงชีทเดียวตามที่ต้องการครับแต่จะได้ข้อมูลเพียงแค่ไฟล์เดียวอยู่ครับ น่าจะเกิดจากการวางทับที่เดิมเราจะปรับให้วิ่งไปวางต่อที่ Row สุดท้ายตรงไหนครับ
ที่ไฟล์ที่ดึงค่ามา ใช้​ UsedRange​ ทำให้เอาค่าว่างที่มีค่าแอบแฝงมาด้วยครับ​ลองลบบรรทัด​ไฟล์ต้นทางแถวสุดท้ายลงโดยกด Ctrl​+Shift​+ลูกศร​ชี้ลง​แล้วกดลบแถวดูครับ​ไปทั้งสามไฟล์แล้วรันใหม่ดูครับ​
ผมทดลองตามคำแนะนำแล้วได้ผลตามที่ต้องการเลยครับ...ขอบคุณมากๆครับ
ผมเดี๋ยวผมจะลองหาวิธีลบค่าว่างของข้อมูลต้นทางอีกทีครับ
Post Reply