: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

เขียนสูตร VBA เพื่อรวม Sheet ให้มารวมกันเหมือนตัวอย่าง

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
SuminO
Member
Member
Posts: 102
Joined: Thu Jul 25, 2019 4:57 pm
Excel Ver: 365 2021

เขียนสูตร VBA เพื่อรวม Sheet ให้มารวมกันเหมือนตัวอย่าง

#1

Post by SuminO »

เขียนสูตร VBA เพื่อรวม Sheet ให้มารวมกันเป็น ชีสเดียวแบบนี้
ผมลองดูแล้วมันมาไม่ครบครับ

Code: Select all

Sub MergeSheets()
    Dim mainSheet As Worksheet
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim targetRow As Long
    Dim i As Long

    On Error Resume Next
    Set mainSheet = ThisWorkbook.Worksheets("MainSheet")
    On Error GoTo 0
    If mainSheet Is Nothing Then
        Set mainSheet = ThisWorkbook.Worksheets.Add
        mainSheet.Name = "MainSheet"
    Else
       ' mainSheet.Cells.Clear
    End If
    
 
    mainSheet.Range("A1:R1").Value = Array("P/O No.", "Date", "CAPRE NO :", "Vendor Name", "Vendor Address", "Vendor Tell", "Credit Term:", "Refer P/R No :", "Dept.Order :", "Item", "Description", "Request Date", "Unit", "Qty", "Unit Price(Baht)", "Amount(Baht)", "Notes:1", "Notes:2", "Notes:3")
    

    targetRow = 3
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> mainSheet.Name Then
            lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
            For i = 18 To lastRow
                
                If ws.Cells(i, "D").Value <> "" Then
                    mainSheet.Cells(targetRow, "A").Resize(1, 15).Value = ws.Range("L9:M9,M4,D10:E12,L13:L14").Value
                    mainSheet.Cells(targetRow, "I").Value = ws.Cells(i, "D").Value
                    mainSheet.Cells(targetRow, "J").Value = ws.Cells(i, "E").Value
                    mainSheet.Cells(targetRow, "K").Value = ws.Cells(i, "I").Value
                    mainSheet.Cells(targetRow, "L").Value = ws.Cells(i, "J").Value
                    mainSheet.Cells(targetRow, "M").Value = ws.Cells(i, "K").Value
                    mainSheet.Cells(targetRow, "N").Value = ws.Cells(i, "L").Value
                    mainSheet.Cells(targetRow, "O").Value = ws.Cells(i, "M").Value
                    mainSheet.Cells(targetRow, "P").Value = ws.Cells(i, "E").Offset(54, 0).Value
                    mainSheet.Cells(targetRow, "Q").Value = ws.Cells(i, "E").Offset(55, 0).Value
                    mainSheet.Cells(targetRow, "R").Value = ws.Cells(i, "E").Offset(56, 0).Value
                    targetRow = targetRow + 1
                End If
            Next i
        End If
    Next ws
End Sub


Attachments
1717568398557.jpg
1717568398557.jpg (82.43 KiB) Viewed 59 times
1717568439120.jpg
1717568439120.jpg (60.74 KiB) Viewed 59 times
BookTEST.xlsm
(54.68 KiB) Downloaded 11 times
SuminO
Member
Member
Posts: 102
Joined: Thu Jul 25, 2019 4:57 pm
Excel Ver: 365 2021

Re: เขียนสูตร VBA เพื่อรวม Sheet ให้มารวมกันเหมือนตัวอย่าง

#2

Post by SuminO »

ปรับได้ประมาณนี้ครับ
แต่ว่า เมื่อ Loop เสร็จ ชีสแรก ไม่ไปหาชีสถัดไปครับ

Code: Select all

Sub MergeSheets()
    Dim mainSheet As Worksheet
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim targetRow As Long
    Dim i As Long
    Dim j As Long
    Dim cell As Range

    On Error Resume Next
    Set mainSheet = ThisWorkbook.Worksheets("MainSheet")
    On Error GoTo 0
    If mainSheet Is Nothing Then
        Set mainSheet = ThisWorkbook.Worksheets.Add
        mainSheet.Name = "MainSheet"
    Else
        mainSheet.Cells.Clear
    End If

    mainSheet.Range("A1:T1").Value = Array("ลำดับ", "P/O No.", "Date", "CAPRE NO :", "Shipping Name", "Vendor Name", "Vendor Address", "Vendor Tell", "Credit Term:", "Refer P/R No :", "Dept.Order :", "Item", "Description", "Request Date", "Unit", "Qty", "Unit Price(Baht)", "Amount(Baht)", "Notes:1", "Notes:2", "Notes:3")


    targetRow = 2 
    For i = 4 To ThisWorkbook.Worksheets.Count
        Set ws = ThisWorkbook.Worksheets(i)

        ' วนลูปข้อมูลในคอลัมน์ D18:D56
        For j = 18 To 56
            If ws.Cells(j, "D").Value <> "" Then
                ' เพิ่มข้อมูลจากชีตปัจจุบันไปยังชีตหลัก
                mainSheet.Cells(targetRow, "A").Value = ws.Name ' ลำดับ
                mainSheet.Cells(targetRow, "B").Value = ws.Range("M11").Value ' P/O No.
                mainSheet.Cells(targetRow, "C").Value = ws.Range("M9").Value ' Date
                mainSheet.Cells(targetRow, "D").Value = ws.Range("M4").Value ' CAPRE NO :
                mainSheet.Cells(targetRow, "E").Value = ws.Range("D10").Value ' Shipping Name
                mainSheet.Cells(targetRow, "F").Value = ws.Range("D12").Value ' Vendor Name
                mainSheet.Cells(targetRow, "G").Value = ws.Range("D13").Value ' Vendor Address
                mainSheet.Cells(targetRow, "H").Value = ws.Range("D14").Value ' Vendor Tell
                mainSheet.Cells(targetRow, "I").Value = ws.Range("M11").Value ' Credit Term:
                mainSheet.Cells(targetRow, "J").Value = ws.Range("L13").Value ' Refer P/R No :
                mainSheet.Cells(targetRow, "K").Value = ws.Range("L14").Value ' Dept.Order :
                mainSheet.Cells(targetRow, "L").Value = ws.Cells(j, "D").Value ' Item
                mainSheet.Cells(targetRow, "M").Value = ws.Cells(j, "E").Value ' Description
                mainSheet.Cells(targetRow, "N").Value = ws.Cells(j, "I").Value ' Request Date
                mainSheet.Cells(targetRow, "O").Value = ws.Cells(j, "J").Value ' Unit
                mainSheet.Cells(targetRow, "P").Value = ws.Cells(j, "K").Value ' Qty
                mainSheet.Cells(targetRow, "Q").Value = ws.Cells(j, "L").Value ' Unit Price(Baht)
                mainSheet.Cells(targetRow, "R").Value = ws.Cells(j, "M").Value ' Amount(Baht)
                mainSheet.Cells(targetRow, "S").Value = ws.Range("E62").Value ' Notes:1
                mainSheet.Cells(targetRow, "T").Value = ws.Range("E63").Value ' Notes:2
                mainSheet.Cells(targetRow, "U").Value = ws.Range("E64").Value ' Notes:3
                targetRow = targetRow + 1
            End If
        Next j
    Next i
End Sub
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: เขียนสูตร VBA เพื่อรวม Sheet ให้มารวมกันเหมือนตัวอย่าง

#3

Post by snasui »

:D ตัวอย่าง Code ตามด้านล่าง ลองไปปรับใช้ดูครับ

Code: Select all

Sub MergeSheets()
    Dim mainSheet As Worksheet
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim targetRow As Long
    Dim i As Long, l As Long
    Dim arr(99999, 20) As Variant

    On Error Resume Next
    Set mainSheet = ThisWorkbook.Worksheets("MainSheet")
    On Error GoTo 0
    If mainSheet Is Nothing Then
        Set mainSheet = ThisWorkbook.Worksheets.Add
        mainSheet.Name = "MainSheet"
    Else
       ' mainSheet.Cells.Clear
    End If
    
    targetRow = 3
    For Each ws In ThisWorkbook.Worksheets
        If ws.Index > 1 And ws.Name <> mainSheet.Name Then
            lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
            For i = 18 To lastRow
                If ws.Cells(i, "D").Value <> "" And IsNumeric(ws.Cells(i, "D").Value) Then
                    arr(l, 0) = VBA.Right(ws.Cells(9, "L").Value, 4)
                    arr(l, 1) = ws.Cells(9, "L").Value
                    arr(l, 2) = ws.Cells(9, "M").Value
                    arr(l, 3) = ws.Cells(4, "M").Value
                    arr(l, 4) = ws.Cells(8, "D").Value
                    arr(l, 5) = ws.Cells(10, "D").Value
                    arr(l, 6) = ws.Cells(11, "E").Value
                    arr(l, 7) = ws.Cells(12, "E").Value
                    arr(l, 8) = ws.Cells(11, "M").Value
                    arr(l, 9) = ws.Cells(13, "L").Value
                    arr(l, 10) = ws.Cells(14, "D").Value
                    arr(l, 11) = ws.Cells(i, "D").Value
                    arr(l, 12) = ws.Cells(i, "E").Value
                    arr(l, 13) = ws.Cells(i, "I").Value
                    arr(l, 14) = ws.Cells(i, "J").Value
                    arr(l, 15) = ws.Cells(i, "K").Value
                    arr(l, 16) = ws.Cells(i, "L").Value
                    arr(l, 17) = ws.Cells(i, "M").Value
                    arr(l, 18) = ws.Cells(62, "E").Value
                    arr(l, 19) = ws.Cells(63, "E").Value
                    arr(l, 20) = ws.Cells(64, "E").Value
                    targetRow = targetRow + 1
                    l = l + 1
                End If
            Next i
        End If
    Next ws
    If l > 0 Then
        With mainSheet
            .Cells.ClearContents
            .Range("A1:U1").Value = Array("ลำดับ", "P/O No.", "Date", "CAPRE NO :", _
                "Shipping Name", "Vendor Name", "Vendor Address", "Vendor Tell", _
                "Credit Term:", "Refer P/R No :", "Dept.Order : ", "Item ", "Description", _
                "Request Date", "Unit", "Qty", "Unit Price(Baht)", "Amount(Baht)", "Notes:1", "Notes:2", "Notes:3")
            .Range("a2").Resize(l, UBound(arr, 2) + 1) = arr
        End With
    End If
End Sub
Post Reply