: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 copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#21

Post by nakhonchai »

เรียนอาจารย์
ผมได้ลองแก้ไขตัวเลขบางส่วนในสูตร ปรากฏว่าได้ตามต้องการครับ
แต่ขออาจารย์ช่วยอธิบายส่วนนี้ให้หน่อยครับ ผมไม่เข้าใจส่วนนี้
ผมลองแบบมี " ' " และ ไม่มี สูตรก็สามารถทำงานได้ปกติ
#ขอบคุณอาจารย์มากครับ

แบบไม่มี

Code: Select all


          shStr = Replace(rall(i).Value, "M", " M")
          shStr = Replace(shStr, "-", "")
          
แบบมี

Code: Select all


'         shStr = Replace(rall(i).Value, "M", " M")
'         shStr = Replace(shStr, "-", "")
สูตรที่แก้ไขใหม่ครับ
ส่วน " For i = 1 To rall.Count Step 8 " แก้เป็น " For i = 1 To rall.Count Step 9 "
ส่วน " rt.Resize(3).Value = _ " แก้เป็น "rt.Resize(9).Value = _ "
ส่วน " rall(i).Offset(0, j).Resize(3).Value " แก้เป็น " rall(i).Offset(0, j).Resize(9).Value "

Code: Select all


Sub Test0()
    Dim rall As Range, shStr As String
    Dim rs As Range, rt As Range
    Dim i As Integer, j As Integer

 With Workbooks("ME15812 LOWER.xlsx").Worksheets("LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For i = 1 To rall.Count Step 9
'         shStr = Replace(rall(i).Value, "M", " M")
'         shStr = Replace(shStr, "-", "")
        shStr = rall(i).Value
        Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E98")
        For j = 4 To 4
                rt.Resize(9).Value = _
                rall(i).Offset(0, j).Resize(9).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i
  
 End With
 End Sub

User avatar
logic
Gold
Gold
Posts: 1511
Joined: Thu Mar 18, 2010 1:57 pm
Excel Ver: 365

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#22

Post by logic »

เครื่องหมาย ' ที่อาจารย์ใช้ในโค้ดคือตัวที่ทำให้โค้ดใช้การไม่ได้ เครื่องหมายนี้เอามานำหน้าคำอธิบายโค้ดกันครับ
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#23

Post by nakhonchai »

สวัสดีครับ อาจารย์
ผมมีเรื่องสอบถามครับ พอดีวันนี้ลูกน้องเพิ่งแจ้งมาว่า VBA ที่ทำไปปัญหาส่วนนึงครับ
พอผมมานั่งดู ปรากฏว่า ปัญหาคือ
- ตรงสูตรที่ว่า " For i = 1 To rall.Count Step 9 "
ถ้าส่วนนั้นมีไม่ถึง 9 อาจมีแค่ 4 หรือ 5 มันจะ copy เอาเลขอื่นมาใส่ด้วยครับ
ทำให้ค่าที่ copy มาไม่ถูกต้อง
ตัวอย่าง
ที่ไฟล์ ME 15812 ที่ Sheet สีแดง M.5A, M.6-10A, M.6-10B, M.7A และ M.8A
จะ Copy ข้อมูลไม่ถูกค่า คือดึงข้อมูลในส่วนที่จะไปใส่ Sheet สีส้มมาใส่ด้วยครับ

ผมได้แนบไฟล์มาให้แล้วครับ
รบกวนอาจารย์ช่วยชี้แนะให้ด้วยครับ
#ขอบคุณมากครับ

Code: Select all


Sub Test0()
    Dim rall As Range, shStr As String
    Dim rs As Range, rt As Range
    Dim i As Integer, j As Integer
    Dim k As Integer, l As Integer
    Dim m As Integer, n As Integer
    Dim o As Integer, p As Integer
    Dim q As Integer, r As Integer
    Dim v As Integer, w As Integer
    
 With Workbooks("ME15812 MOLD LOWER.xlsx").Worksheets("ME15812 MOLD LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For i = 1 To rall.Count Step 9
        shStr = rall(i).Value
        Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E98")
        For j = 4 To 4
                rt.Resize(9).Value = _
                rall(i).Offset(0, j).Resize(9).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i
    
    For k = 1 To rall.Count Step 9
            shStr = rall(k).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("H108")
            For l = 5 To 7
                rt.Resize(9).Value = _
                    rall(k).Offset(0, l).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next l
        Next k
        
    For m = 1 To rall.Count Step 9
            shStr = rall(m).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E117")
            For n = 10 To 15
                rt.Resize(9).Value = _
                    rall(m).Offset(0, n).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next n
        Next m
        
    For o = 1 To rall.Count Step 9
            shStr = rall(o).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E126")
            For p = 17 To 22
                rt.Resize(9).Value = _
                    rall(o).Offset(0, p).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next p
        Next o
  End With

With Workbooks("ME15812 MOLD UPPER.xlsx").Worksheets("ME15812 MOLD UPPER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For q = 1 To rall.Count Step 9
            shStr = rall(q).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E108")
            For r = 4 To 6
                rt.Resize(9).Value = _
                    rall(q).Offset(0, r).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next r
        Next q
        
    For v = 1 To rall.Count Step 9
            shStr = rall(v).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E162")
            For w = 7 To 9
                rt.Resize(9).Value = _
                    rall(v).Offset(0, w).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next w
        Next v
               
End With

End Sub


Attachments
ME 15812.xlsx
(221.46 KiB) Downloaded 11 times
ME15812 MOLD LOWER.xlsx
(20.91 KiB) Downloaded 9 times
ME15812 MOLD UPPER.xlsx
(17.5 KiB) Downloaded 9 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: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#24

Post by snasui »

:D ได้ลองปรับแก้มาเองแล้วหรือไม่ แก้เป็นอย่างไร แก้แล้วติดปัญหาตรงไหน อย่างไร ถ้ายังไม่ลองปรับมาเอง ให้ลองปรับมาก่อนครับ
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#25

Post by nakhonchai »

เรียนอาจารย์
ผมลองเขียนสูตรดูแล้วครับโดยศึกษาจากเวปของอาจารย์
ผมเข้าใจว่าใน 2 หัวข้อนี้น่าจะช่วยผมได้ พอลองทำไม่ได้จริงๆครับ
- cilp VBA Excel - Loop Structure - For...Next #L 38/40
- clip VBA Excel - Loop Structure - For...Loop 2 #L 39/40

รบกวนอาจารย์ให้คำแนะนำด้วยครับ
คือจากเดิมเราจะใช้ For i = 1 To rall.Count Step 9 คือเมื่อเจอคำๆใดจะ copy ข้อมูลไป 9 แถว
แต่ปัญหาคือถ้าคำนั้นไม่ถึง 9 แถวมันจะ Copy ของแถวอื่นมาด้วยครับ

ผมลองเขียนสูตรตามความเข้าใจมาให้ดูครับแต่ไม่ได้
รบกวนอาจารย์ช่วยแนะนำทีครับ
ขอบคุณมากครับ
#ไฟล์ ME15812_01 คือไฟล์ข้อมูลที่ต้องการ
#ไฟล์ ME15812_02 คือไฟล์ที่โปรแกรมเดิม copy มาครับ

โปรแกรมที่ผมลองเขียนใหม่ครับ

Code: Select all


Sub Test0()
    Dim rall As Range, shStr As String
    Dim rs As Range, rt As Range
    Dim i As Integer, j As Integer
    
With Workbooks("ME15812 MOLD LOWER.xlsx").Worksheets("ME15812 MOLD LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For Each rs In rall
        If rs.Value = "M.5A" Then
            shStr = rall(i).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E98")
            For j = 4 To 4
                rt.Resize(rs).Value = _
                rall(rs).Offset(0, j).Resize(rs).Value
            Set rt = rt.Offset(0, 1)
            Next j
        End If
    Next
    
End With

End Sub

โปรแกรมตัวเก่าที่ใช้อยู่ครับ

Code: Select all


Sub Test0()
    Dim rall As Range, shStr As String
    Dim rs As Range, rt As Range
    Dim i As Integer, j As Integer
    Dim k As Integer, l As Integer
    Dim m As Integer, n As Integer
    Dim o As Integer, p As Integer
    Dim q As Integer, r As Integer
    Dim v As Integer, w As Integer
    
 With Workbooks("ME15812 MOLD LOWER.xlsx").Worksheets("ME15812 MOLD LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For i = 1 To rall.Count Step 9
        shStr = rall(i).Value
        Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E98")
        For j = 4 To 4
                rt.Resize(9).Value = _
                rall(i).Offset(0, j).Resize(9).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i
    
    For k = 1 To rall.Count Step 9
            shStr = rall(k).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("H108")
            For l = 5 To 7
                rt.Resize(9).Value = _
                    rall(k).Offset(0, l).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next l
        Next k
        
    For m = 1 To rall.Count Step 9
            shStr = rall(m).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E117")
            For n = 10 To 15
                rt.Resize(9).Value = _
                    rall(m).Offset(0, n).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next n
        Next m
        
    For o = 1 To rall.Count Step 9
            shStr = rall(o).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E126")
            For p = 17 To 22
                rt.Resize(9).Value = _
                    rall(o).Offset(0, p).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next p
        Next o
  End With

With Workbooks("ME15812 MOLD UPPER.xlsx").Worksheets("ME15812 MOLD UPPER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For q = 1 To rall.Count Step 9
            shStr = rall(q).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E108")
            For r = 4 To 6
                rt.Resize(9).Value = _
                    rall(q).Offset(0, r).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next r
        Next q
        
    For v = 1 To rall.Count Step 9
            shStr = rall(v).Value
            Set rt = Workbooks("ME 15812.xlsx").Worksheets(shStr).Range("E162")
            For w = 7 To 9
                rt.Resize(9).Value = _
                    rall(v).Offset(0, w).Resize(9).Value
                Set rt = rt.Offset(0, 1)
            Next w
        Next v
               
End With

End Sub
Attachments
ME 15812_01.xlsx
(216.69 KiB) Downloaded 10 times
ME 15812_02.xlsx
(221.46 KiB) Downloaded 10 times
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#26

Post by nakhonchai »

ตัวอย่างไฟล์ข้อมูลที่ต้องการครับ
Attachments
ME15812 MOLD LOWER.xlsx
(20.91 KiB) Downloaded 13 times
ME15812 MOLD UPPER.xlsx
(17.5 KiB) Downloaded 11 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: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#27

Post by snasui »

:D ช่วยแนบไฟล์โปรแกรมพร้อม Code ล่าสุดมาด้วยจะได้สะดวกในการตอบครับ
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#28

Post by nakhonchai »

ขอบคุณอาจารย์มากครับ
มี 2 ไฟล์
- ไฟล์ที่ผมลองแก้ไขใหม่แต่ไม่ได้ผล
- ไฟล์เดิมที่ใช้อยู่ครับ แต่กรณีถ้าช่วงไหนมีไม่ถึง 9 ข้อมูลที่ได้จะไม่ถูกต้อง
อาจารย์พอแนะนำ เวป หรือ หนังสือให้หน่อยได้ใหมครับ
ผมอยากศึกษาให้เข้าใจมากกว่านี้
ตอนนี้ผมหาศึกษาทาง google และ Youtube ในส่วนที่อยากรู้ว่าเขียนแบบไหนเอาครับ
และไล่ค้นหาในกระทู้นี่ละครับ แบบแอบทักลักไปปรับใช้เอา 555

ขอบคุณอาจารย์อีกครั้งครับ
Attachments
VBA Copy ที่แก้ใหม่.xlsb
(17.38 KiB) Downloaded 14 times
VBA Copy ตัวที่ใช้อยู่.xlsb
(19.76 KiB) Downloaded 11 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: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#29

Post by snasui »

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

Code: Select all

Dim rall As Range
Dim rs As Range, rt As Range, r As Range
Dim i As Integer, j As Integer
Dim o As Object, k As Integer
Dim a As Variant, b As Variant
Set o = CreateObject("Scripting.Dictionary")

With Workbooks("ME15812 MOLD LOWER.xlsx").Worksheets("ME15812 MOLD LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For Each rs In rall
        If Not o.Exists(rs.Value) Then
            k = Application.CountIf(rall, rs.Value)
            o.Add Item:=rs.Address(0, 0) & "|" & k, Key:=rs.Value
        End If
    Next rs
    a = o.keys
    For i = 0 To UBound(a)
        Set rt = Workbooks("ME 15812_01.xlsx").Worksheets(a(i)).Range("E98")
        b = Split(o.Item(a(i)), "|")
        For j = 4 To 7
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, j).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i
End With
ปรับ For j = ... ให้ตรงกับข้อมูลที่จะใช้จริง

Code นี้ยากมากจะต้องเข้าใจหลายเรื่อง คือการ Loop ด้วย For, Scripting.Dictionary, Array ลองค้นดูวิธีใช้แบบนี้ผ่าน Google และ Youtube ครับ
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#30

Post by nakhonchai »

ขอบคุณมากครับอาจารย์
ผมลองเขียนขยายไป copy แถวอื่น ตรงที่ต้องการเลยครับ

"Code นี้ยากมากจะต้องเข้าใจหลายเรื่อง คือการ Loop ด้วย For, Scripting.Dictionary, Array ลองค้นดูวิธีใช้แบบนี้ผ่าน Google และ Youtube ครับ"

#จะหาศึกษาเพิ่มเติมตามคำแนะนำครับ
#ขอบคุณมากๆครับอาจารย์
nakhonchai
Member
Member
Posts: 67
Joined: Fri Jan 25, 2019 6:45 pm
Excel Ver: 2016

Re: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#31

Post by nakhonchai »

สวัสดีครับอาจารย์
ผมใคร่ขอความช่วยเหลือดังนี้ครับ

นี่เป็นสูตรที่ผมเขียนครับ
มีปัญหาที่ว่า ถ้า sheet ไหนไม่ได้มีการ copy ข้อมูลมา มันจะใส่คำว่า "OK" ด้วย

ผมต้องการให้ใส่คำว่า "OK" ในช่องสีเหลืองใน ไฟล์ ME15812 เฉพาะกรณีที่ sheet นั้นมีการ copy ข้อมูลมาเท่านั้นครับ

ตัวอย่างในไฟล์ ME15812 SLIT จะไม่มีข้อมูลของ Sheet Sl-42 และ SL-46 เมื่อทำการ copy ข้อมูลจะต้องไม่ใส่คำว่า "OK" ในช่องเหลือง

รบกวนอาจารย์ช่วยให้คำชี้แนะด้วยครับ
ขอบคุณมากครับ

Code: Select all


Sub Button1_Click()

Dim rall As Range
Dim rs As Range, rt As Range, r As Range
Dim i As Integer, j As Integer
Dim e As Integer, f As Integer
Dim g As Integer, h As Integer
Dim m As Integer, n As Integer
Dim q As Integer, c As Integer
Dim v As Integer, w As Integer
Dim o As Object, k As Integer
Dim a As Variant, b As Variant
Set o = CreateObject("Scripting.Dictionary")

With Workbooks("ME15812 SLIT.xlsx").Worksheets("ME15812 SLIT")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For Each rs In rall
        If Not o.Exists(rs.Value) Then
            k = Application.CountIf(rall, rs.Value)
            o.Add Item:=rs.Address(0, 0) & "|" & k, Key:=rs.Value
        End If
    Next rs
    a = o.keys
    
    For i = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F101")
        b = Split(o.Item(a(i)), "|")
        For j = 4 To 9
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, j).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i
    
    For e = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(e)).Range("F104")
        b = Split(o.Item(a(e)), "|")
        For f = 12 To 17
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, f).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next f
    Next e
      
    For g = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(g)).Range("F98")
        b = Split(o.Item(a(g)), "|")
        For h = 24 To 29
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, h).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next h
    Next g
    
    For m = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(m)).Range("F119")
        b = Split(o.Item(a(m)), "|")
        For n = 38 To 40
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, n).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next n
    Next m

    For q = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(q)).Range("F116")
        b = Split(o.Item(a(q)), "|")
        For c = 41 To 46
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, c).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next c
    Next q

    For v = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(v)).Range("F113")
        b = Split(o.Item(a(v)), "|")
        For w = 47 To 52
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, w).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next w
    Next v

End With

Set wbTaget = Workbooks("ME15812.xlsx")
        
    Set shTaget = wbTaget.Sheets("SL-41")
        shTaget.Range("F122:U124").Value = "OK"
    Set shTaget = wbTaget.Sheets("SL-42")
        shTaget.Range("F122:U124").Value = "OK"
    Set shTaget = wbTaget.Sheets("SL-46")
        shTaget.Range("F122:U124").Value = "OK"
    Set shTaget = wbTaget.Sheets("SL-48")
        shTaget.Range("F122:U124").Value = "OK"
    Set shTaget = wbTaget.Sheets("SL-50")
        shTaget.Range("F122:U124").Value = "OK"
    Set shTaget = wbTaget.Sheets("SL-37")
        shTaget.Range("F122:U124").Value = "OK"

End Sub

Attachments
ME15812.xlsx
(276.95 KiB) Downloaded 12 times
ME15812 SLIT.xlsx
(23.72 KiB) Downloaded 12 times
VBA Copy Slit.xlsb
(16.33 KiB) Downloaded 11 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: ขอสูตร VBA copy ข้อมูลจากไฟล์หนึ่งไปอีกไฟล์ แบบมีเงื่อนไข

#32

Post by snasui »

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

Code: Select all

With Workbooks("ME15812 SLIT.xlsx").Worksheets("ME15812 SLIT")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For Each rs In rall
        If Not o.Exists(rs.Value) Then
            k = Application.CountIf(rall, rs.Value)
            o.Add Item:=rs.Address(0, 0) & "|" & k, Key:=rs.Value
        End If
    Next rs
    a = o.keys
    
    For i = 0 To UBound(a)
        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F101")
        b = Split(o.Item(a(i)), "|")
        For j = 4 To 9
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, j).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next j

        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F104")
        b = Split(o.Item(a(e)), "|")
        For f = 12 To 17
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, f).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next f

        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F98")
        b = Split(o.Item(a(g)), "|")
        For h = 24 To 29
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, h).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next h

        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F119")
        b = Split(o.Item(a(m)), "|")
        For n = 38 To 40
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, n).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next n

        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F116")
        b = Split(o.Item(a(q)), "|")
        For c = 41 To 46
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, c).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next c

        Set rt = Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F113")
        b = Split(o.Item(a(v)), "|")
        For w = 47 To 52
            rt.Resize(b(1)).Value = _
                .Range(b(0)).Offset(0, w).Resize(b(1)).Value
            Set rt = rt.Offset(0, 1)
        Next w
        Workbooks("ME15812.xlsx").Worksheets(a(i)).Range("F122:U124").Value = "OK"
    Next i
End With
Post Reply