: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 เพื่อรวมชีสแต่ว่าข้อมูลชีสจัดตำแหน่งไม่เป็นรูปแบบไม่เหมือนตารางหลัก

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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 เพื่อรวมชีสแต่ว่าข้อมูลชีสจัดตำแหน่งไม่เป็นรูปแบบไม่เหมือนตารางหลัก

#1

Post by SuminO »

สร้างโค๊ด VBA เพื่อรวมชีสแต่ว่าข้อมูลชีสจัดตำแหน่งไม่เป็นรูปแบบที่คล้ายกันกับตารางหลัก
เพื่อรวมทุกชีสมาไว้ในชีสเดียวกัน ชีส Main คือชีสหลัก โดยมีหัวข้อเก็บข้อมูลจาก A1:V1
แต่รูปแบบข้องชีสต่าง ๆ ไม่เหมือนกันต่างกันแค่ ภาค และจังหวัด
เช่นชีส ProductUpdate A1 คือหัวข้อ =ชื่อ A2 จะเป็นภาค และ A3 คือจังหวัด แล้วถัดลงมาจากจังหวัดก็คือรายชื่อที่ต้องการเก็บ

จะเป็นรูปแบบนี้ทุกชีส
ฉันจะเขียนสูตรยังไง เมื่อ A1:A100
มีคำว่า ภาคให้นำข้อมูลไปลงที่ ชีส Main A1

โค๊ดที่สร้างได้ข้อมูลยังไม่ตรงครับมันวนซ้ำหลายรอบ
ต้องปรับตรงไหน

รบกวนอาจารย์ด้วย
และขอบพระคุณล่วงหน้าครับ

Code: Select all

Sub ConsolidateSheets()
    Dim ws As Worksheet
    Dim mainWs As Worksheet
    Dim lastRow As Long
    Dim copyRow As Long
    Dim dataStartRow As Long

    Set mainWs = ThisWorkbook.Sheets("Main")

    mainWs.Range("A2:V100").ClearContents

    copyRow = 2

    For Each ws In ThisWorkbook.Worksheets

        If ws.Name <> mainWs.Name Then
     
            For i = 1 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
                If ws.Cells(i, 1).Value Like "*ภาค*" Then
                                   dataStartRow = i + 2
                    
                                    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
                    ws.Range(ws.Cells(dataStartRow, 1), ws.Cells(lastRow, 22)).Copy
                    mainWs.Range("A" & copyRow).PasteSpecial Paste:=xlPasteValues
        
                    copyRow = mainWs.Cells(mainWs.Rows.Count, "A").End(xlUp).Row + 1
                End If
            Next i
        End If
    Next ws
    

    Application.CutCopyMode = False
    
 
End Sub

Attachments
1721014127926.jpg
1721014127926.jpg (44.3 KiB) Viewed 82 times
1721014152807.jpg
1721014152807.jpg (62.32 KiB) Viewed 82 times
รวมชีส.xlsm
(37.38 KiB) Downloaded 11 times
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 เพื่อรวมชีสแต่ว่าข้อมูลชีสจัดตำแหน่งไม่เป็นรูปแบบไม่เหมือนตารางหลัก

#2

Post by snasui »

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

Code: Select all

Sub ConsolidateSheets()
    Dim ws As Worksheet, rall As Range, r As Range
    Dim mainWs As Worksheet, rg As String, pv As String, pd As String
    Dim i As Integer
    Dim arr(99999, 8) As Variant
    Set mainWs = ThisWorkbook.Sheets("Main")
    
    mainWs.Range("A2").CurrentRegion.Offset(1, 0).ClearContents
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> mainWs.Name Then
            With ws
                Set rall = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
                For Each r In rall
                    If InStr(r.Value, "ภาค") Then
                        rg = r.Value
                    ElseIf InStr(r.Value, "Product") Then
                        pd = r.Value
                    Else
                        pv = r.Value
                    End If
                    If r.Offset(0, 1).Value <> "" Then
                        arr(i, 0) = rg
                        arr(i, 1) = pv
                        arr(i, 2) = pd
                        arr(i, 3) = ws.Name
                        arr(i, 4) = r.Offset(0, 1).Value
                        arr(i, 5) = r.Offset(0, 2).Value
                        arr(i, 6) = r.Offset(0, 3).Value
                        arr(i, 7) = r.Offset(0, 4).Value
                        arr(i, 8) = r.Offset(0, 5).Value
                        i = i + 1
                    End If
                Next r
            End With
        End If
    Next ws
    With mainWs
        If i > 0 Then
            .Range("a2").Resize(i, UBound(arr, 2) + 1).Value = arr
        End If
    End With

End Sub

Post Reply