: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 ให้มารวมกันเหมือนตัวอย่าง

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and 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: 81
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


You do not have the required permissions to view the files attached to this post.
SuminO
Member
Member
Posts: 81
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: 30801
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
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