: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

merge file ด้วย VBA

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

merge file ด้วย VBA

#1

Post by nilrop »

สวัสดีค่ะ มีปัญหาเรื่อง excel สอบถามดังนี้ค่ะ

อยาก merge ไฟล์ หลายๆไฟล์ ให้กลายเป็นไฟล์เดียวกัน จากที่หาความรู้ใน google มา ได้ code VBA มาจาก web ต่างประเทศ จะเอามาประยุกต์ใช้ดู แต่ปรากฎว่าผลลัพธ์ที่รวมสำเร็จแล้ว ออกมาไม่ครบทุกบรรทัดค่ะ

รบกวนถามผู้รู้ว่า ต้องปรับ CODE เป็นอย่างไรคะ จึงจะให้รวมออกมาให้ครบทุกบรรทัด (ไฟล์ที่จะให้รวมกัน ดาวน์โหลดออกมาจากระบบฐานข้อมูล ไม่ได้ปรับแต่งใดๆๆทั้งสิ้นค่ะ)

Code: Select all

Sub simpleXlsMerger()
Dim bookList As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
 
Set dirObj = mergeObj.Getfolder("C:\Users\Desktop\test")
Set filesObj = dirObj.Files
For Each everyObj In filesObj
Set bookList = Workbooks.Open(everyObj)
 

Range("A1:IV" & Range("A65536").End(xlUp).Row).Copy
ThisWorkbook.Worksheets(1).Activate
 

Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial
Application.CutCopyMode = False
bookList.Close
Next
End Sub
จาก code นี้ สิ่งที่ต้องปรับเองคือ C:\Users\Desktop\test ซึ่งเป็นที่อยู่ของไฟล์นั้นๆค่ะ

ขอบคุณมากค่ะ
Attachments
test.rar
ไฟล์ตัวอย่างข้อมูล
(17.12 KiB) Downloaded 22 times
ajsudkedt
Gold
Gold
Posts: 1192
Joined: Thu Jan 28, 2010 11:08 am
Excel Ver: 365

Re: merge file ด้วย VBA

#2

Post by ajsudkedt »

http://www.snasui.com/download/file.php?id=6960
ไม่รู้ว่าตัวนี้จะตอบโจทย์ได้ไหม ลองดูครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#3

Post by nilrop »

ajsudkedt wrote:http://www.snasui.com/download/file.php?id=6960
ไม่รู้ว่าตัวนี้จะตอบโจทย์ได้ไหม ลองดูครับ

ลองดูแล้ว มันออกมาแต่หัวรายงาน แต่รายละเอียดไม่มีให้เลยค่ะ :shock:
ajsudkedt
Gold
Gold
Posts: 1192
Joined: Thu Jan 28, 2010 11:08 am
Excel Ver: 365

Re: merge file ด้วย VBA

#4

Post by ajsudkedt »

ต้องเอาหัวรายงานมาใส่บรรทัดของแต่ละรายละเอียดครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#5

Post by nilrop »

ajsudkedt wrote:ต้องเอาหัวรายงานมาใส่บรรทัดของแต่ละรายละเอียดครับ

ขยายความหน่อยได้ไหมคะ ว่าต้องจัการอย่างไรจึงจะสะดวกสุด ถ้า copy แปะ ทุกไฟล์ User บอกไม่ไหวค่ะ

สาเหตุที่ต้องเอาหัวรายงานไว้เพราะมีวันที่ ถ้าตัดออกแล้วเวลาเอามารวมกันจะไม่รู้ว่ารายละเอียดนี้เป็นของวันไหนค่ะ

หรือมีวิธีอื่นที่ดีกว่านี้ ขอคำชี้แนะด้วย ขอบคุณมากค่ะ
ajsudkedt
Gold
Gold
Posts: 1192
Joined: Thu Jan 28, 2010 11:08 am
Excel Ver: 365

Re: merge file ด้วย VBA

#6

Post by ajsudkedt »

คือเอาวันที่ส่วนหัวมาใส่บรรทัดของข้อมูล ให้อยู่คนล่ะคอลัมน์แต่บรรทัดเดียวกันน่ะครับ
เวลารวมมันถึงจะรู้ว่าข้อมูลนี้เป็นของวันที่เท่าไหร่ครับ
และคงต้องทำทีละ user ถ้าให้เร็วกว่านี้รอผู้รู้ท่านอื่นมาตอบนะครับ
รู้เท่านี้จริง ๆ ครับ ;)
โชคดีครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#7

Post by nilrop »

ajsudkedt wrote:คือเอาวันที่ส่วนหัวมาใส่บรรทัดของข้อมูล ให้อยู่คนล่ะคอลัมน์แต่บรรทัดเดียวกันน่ะครับ
เวลารวมมันถึงจะรู้ว่าข้อมูลนี้เป็นของวันที่เท่าไหร่ครับ

ตั้งใจว่าจะต้องดัดแปลงข้อมูลอีกครั้ง โดยใช้ macro ช่วย แต่ต้องทำหลังจากที่รวมไฟล์ได้แล้วค่ะ แต่จะให้มาทำทีละไฟล์ 30 ไฟล์ User ไม่ไหวค่ะ

คิดเองว่า ข้อมูลมันมีบรรทัดว่างอยู่ code เลยไม่รู้ว่าบรรทัดไหนเป็นบรรทัดสุดท้าย ประมาณนี้ไหมคะ ขอบคุณท่านมากค่ะ
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#8

Post by snasui »

:D แนบไฟล์ที่เขียน Code พร้อมตัวอย่างคำตอบที่ต้องการมาด้วยครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#9

Post by nilrop »

แนบไฟล์ตัวอย่าง result คือ รายงานที่ต้องการ ส่วน merge test คือ ไฟล์ที่มี code ค่ะ

ขอบคุณมากค่ะ
Attachments
merge files.rar
(22.22 KiB) Downloaded 35 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#10

Post by snasui »

:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Sub simpleXlsMerger()
    Dim bookList As Workbook
    Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
    Application.ScreenUpdating = False
    Set mergeObj = CreateObject("Scripting.FileSystemObject")
     
    Set dirObj = mergeObj.Getfolder("C:\Users\Administrator.WIN-QU797C1H8M2\Desktop\test")
    Set filesObj = dirObj.Files
    For Each everyObj In filesObj
        Set bookList = Workbooks.Open(everyObj)
        bookList.Sheets(1).Range("A1:O" & bookList.Sheets(1).Range("O65536").End(xlUp).Row).Copy
        ThisWorkbook.Worksheets(1).Activate
        Range("O65536").End(xlUp).Offset(1, -14).PasteSpecial
        Application.CutCopyMode = False
        bookList.Close False
    Next
    Application.ScreenUpdating = True
End Sub
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#11

Post by nilrop »

:thup: ขอบพระคุณมากค่ะ ได้ครบถ้วนตามที่ต้องการเลยค่ะ

อยากทราบเป็นความรู้หน่อยค่ะ ช่วยอธิบายโค้ดเดิมให้หน่อยได้ไหมคะ มันใช้ไม่ได้เพราะมีปัญหาอะไร จะเกี่ยวกับคอลัมภ์ไหม เพราะอันใหม่นี้ปรับตรงคอลัมภ์เป็น o และช่วง offset ด้วยค่ะ มันส่งผลยังไงบ้างคะ

ความรู้เรื่อง VBA ยังไม่ชำนาญค่ะ เพิ่งเริ่มจะหัดเองค่ะ :D :thup:
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#12

Post by nilrop »

ลืมอีกประเด็นหนึ่งคือ ไฟล์ข้อมูลมีการ merge cell + wrap text ไว้ด้วย ถ้าจะให้ตอนรวมไฟล์ ยกเลิกการ merge พวกนี้ไปด้วยเลยได้ไหมคะ เพิ่ม code ตรงไหนได้บ้าง ถ้าไม่งั้นคงต้องกดยกเลิกเองค่ะ ก็ยังพอไหวค่ะไฟล์เดียว

ขอบคุณอีกครั้งค่ะ :cp: :cp: :cp:
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#13

Post by snasui »

nilrop wrote: มันใช้ไม่ได้เพราะมีปัญหาอะไร จะเกี่ยวกับคอลัมภ์ไหม
:D เกี่ยวกับคอลัมน์โดยตรงครับ
nilrop wrote:เพราะอันใหม่นี้ปรับตรงคอลัมภ์เป็น o
ที่ต้องเปลี่ยนเป็นคอลัมน์ O เพราะว่าคอลัมน์เดิมเป็น IV ไม่มีข้อมูล ไม่สามารถเป็นตัวแทนของการหาบรรทัดสุดท้ายของข้อมูลได้ สำหรับคอลัมน์ O เป็นคอลัมน์ที่มีข้อมูลและเป็นตัวแทนของการหาบรรทัดสุดท้ายที่มีข้อมูลได้ โดยปกติการหาบรรทัดสุดท้ายจะต้องคำนึงถึงคอลัมน์ที่มีข้อมูลเสมอ ไม่ใช่คอลัมน์ใดก็ได้ครับ

.End(xlUp).Row เป็นการหาบรรทัดสุดท้ายที่มีข้อมูล

.Offset(1, -14) หมายถึงให้ลงไปด้านล่าง 1 บรรทัดและไปด้านซ้าย 14 คอลัมน์
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#14

Post by snasui »

nilrop wrote:ไฟล์ข้อมูลมีการ merge cell + wrap text ไว้ด้วย ถ้าจะให้ตอนรวมไฟล์ ยกเลิกการ merge พวกนี้ไปด้วยเลยได้ไหมคะ เพิ่ม code ตรงไหนได้บ้าง
:D ให้เขียนมาเองก่อน หากเขียนเองไม่ให้ให้ลองบันทึก Macro แล้วปรับใช้ ติดตรงไหนค่อยถามกันต่อครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#15

Post by nilrop »

จะลองใช้ macro เขียนดูก่อนค่ะ แล้วจะมารายงานผลให้ทราบ ขอบคุณมากนะคะ :thup: :cp:


edit: ใช้ macro ช่วย สำเร็จแล้วค่ะ :cp: :cp: :cp: เว็บนี้มีประโยชน์มากเลย ขอบคุณที่แชร์พื้นที่ให้ความรู้กันนะคะ :thup: :thup: :thup: :P
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#16

Post by nilrop »

รบกวนถามเพิ่มเติม
1. ถ้าหาก เปลี่ยนที่อยู่ของโฟลเดอร์ให้เป็น Range A1 แล้วค่อยก๊อปปี้ที่อยู่มาวางไว้ที่ A1 แทนที่จะต้องไปแก้ใน code มันก็รวมไฟล์ให้เหมือนกัน แต่มันจะรวมไว้ที่ sheet 1 เสมอ แต่ถ้าอยากให้มันไปรวมไว้ที่ sheet 2 ต้องเพิ่มตรงไหนบ้าง ลองเติม Sheets("Sheet2").Select แต่ไม่ได้ผลค่ะ

2.ถ้าข้อมูลมีคอลัมน์ยาวกว่าคอลัมน์ O แล้วต้องแก้ตรง Offset(1, -14) ด้วยหรือไม่คะ

ขอบคุณมากๆค่ะ
Attachments
test2.rar
(36.8 KiB) Downloaded 24 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#17

Post by snasui »

nilrop wrote:1. ถ้าหาก เปลี่ยนที่อยู่ของโฟลเดอร์ให้เป็น Range A1 แล้วค่อยก๊อปปี้ที่อยู่มาวางไว้ที่ A1 แทนที่จะต้องไปแก้ใน code มันก็รวมไฟล์ให้เหมือนกัน แต่มันจะรวมไว้ที่ sheet 1 เสมอ แต่ถ้าอยากให้มันไปรวมไว้ที่ sheet 2 ต้องเพิ่มตรงไหนบ้าง ลองเติม Sheets("Sheet2").Select แต่ไม่ได้ผลค่ะ
:D ตัวอย่างการปรับ Code ให้แสดงที่ Sheet2 ครับ

Code: Select all

Sub simpleXlsMerger()
    'Sheets("Sheet2").Select
    Dim bookList As Workbook
    Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
    Application.ScreenUpdating = False
    Set mergeObj = CreateObject("Scripting.FileSystemObject")
     
    Set dirObj = mergeObj.Getfolder(Sheets("Sheet2").Range("A1"))
    Set filesObj = dirObj.Files
    For Each everyObj In filesObj
        Set bookList = Workbooks.Open(everyObj)
        bookList.Sheets(1).Range("A1:O" & bookList.Sheets(1).Range("O65536").End(xlUp).Row).Copy
        ThisWorkbook.Worksheets(2).Activate
        If Range("O65536").End(xlUp).Offset(1, -14).Row = 2 Then
            Range("a1").PasteSpecial
        Else
            Range("O65536").End(xlUp).Offset(1, -14).PasteSpecial
        End If
        Application.CutCopyMode = False
        bookList.Close False
    Next
    Application.ScreenUpdating = True
End Sub
nilrop wrote:2.ถ้าข้อมูลมีคอลัมน์ยาวกว่าคอลัมน์ O แล้วต้องแก้ตรง Offset(1, -14) ด้วยหรือไม่คะ
ไม่ใช่แก้แค่ตรง Offset เท่านั้น จะต้องแก้ bookList.Sheets(1).Range("A1:O" & bookList.Sheets(1).Range("O65536").End(xlUp).Row).Copy และ Range("O65536").End(xlUp).Offset(1, -14).Row ครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#18

Post by nilrop »

ลองแก้แบบนี้ค่ะ พอใช้ได้ไหมคะ ภายใต้เงื่อนไข
1. อยากให้แสดงข้อมูลรวมที่ sheet5
2. ข้อมูลแต่ละไฟล์สิ้นสุดที่คอลัมน์ Q
3. อยากให้รวมข้อมูลตั้งแต่แถว 1

Code: Select all

Set dirObj = mergeObj.Getfolder(Sheets("Sheet5").Range("A1"))
    Set filesObj = dirObj.Files
    For Each everyObj In filesObj
        Set bookList = Workbooks.Open(everyObj)
        bookList.Sheets(1).Range("A1:Q" & bookList.Sheets(1).Range("Q65536").End(xlUp).Row).Copy
        ThisWorkbook.Worksheets(5).Activate
        If Range("Q65536").End(xlUp).Offset(1, -16).Row = 1 Then
            Range("a1").PasteSpecial
        Else
            Range("Q65536").End(xlUp).Offset(1, -16).PasteSpecial
        End If
ป.ล.
  • ThisWorkbook.Worksheets(5).Activate
อันนี้คือ บอกลำดับของชีท หรือเปล่าคะ ถ้าสมมติว่ามี sheet ทั้งหมด 10 sheet แล้ว sheet5 อยู่ลำดับที่เท่าไหร่ ก็ต้องแก้ตามนั้นหรือเปล่าคะ เช่น sheet 5 อยู่ลำดับที่ 2 ก็แก้เป็นเลข 2 ถูกไหมคะ -- พอดีมือใหม่ VBA หาเหตุผลทำความเข้าใจเองค่ะ :oops: :oops:

ขอบคุณมากๆเลยค่ะ ได้ความรู้ขึ้นเยอะเลย :thup: :cp: :D
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: merge file ด้วย VBA

#19

Post by snasui »

:D ลองก่อนเลยครับ จะได้ตอบตัวเองได้ว่าถูกหรือไม่ถูก ติดแล้วค่อยถามกันครับ

ตัวเลขในวงเล็บของ Worksheets(Number) เป็นลำดับของชีทเรียงจากซ้ายไปขวา เข้าใจถูกต้องแล้วครับ
nilrop
Member
Member
Posts: 20
Joined: Fri Nov 07, 2014 3:18 pm

Re: merge file ด้วย VBA

#20

Post by nilrop »

เรียบร้อยค่ะ ได้ผลตามต้องการ ขอบคุณมากๆนะคะ :cp: :cp: :thup: :thup:
Post Reply