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

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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่

Post a reply


This question is a means of preventing automated form submissions by spambots.
Smilies
:D :thup: :cp: :flw: :rz: :sg: :tt: :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :ard: :arl: :aru: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

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

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

#32

by snasui » Sun Sep 29, 2019 7:30 pm

: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

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

#31

by nakhonchai » Sat Sep 28, 2019 1:28 pm

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

นี่เป็นสูตรที่ผมเขียนครับ
มีปัญหาที่ว่า ถ้า 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 13 times
ME15812 SLIT.xlsx
(23.72 KiB) Downloaded 12 times
VBA Copy Slit.xlsb
(16.33 KiB) Downloaded 12 times

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

#30

by nakhonchai » Fri Sep 13, 2019 7:32 am

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

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

#จะหาศึกษาเพิ่มเติมตามคำแนะนำครับ
#ขอบคุณมากๆครับอาจารย์

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

#29

by snasui » Thu Sep 12, 2019 10:24 pm

: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 ครับ

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

#28

by nakhonchai » Thu Sep 12, 2019 8:56 pm

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

ขอบคุณอาจารย์อีกครั้งครับ
Attachments
VBA Copy ที่แก้ใหม่.xlsb
(17.38 KiB) Downloaded 15 times
VBA Copy ตัวที่ใช้อยู่.xlsb
(19.76 KiB) Downloaded 12 times

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

#27

by snasui » Thu Sep 12, 2019 8:43 pm

:D ช่วยแนบไฟล์โปรแกรมพร้อม Code ล่าสุดมาด้วยจะได้สะดวกในการตอบครับ

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

#26

by nakhonchai » Thu Sep 12, 2019 3:33 pm

ตัวอย่างไฟล์ข้อมูลที่ต้องการครับ
Attachments
ME15812 MOLD UPPER.xlsx
(17.5 KiB) Downloaded 12 times
ME15812 MOLD LOWER.xlsx
(20.91 KiB) Downloaded 13 times

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

#25

by nakhonchai » Thu Sep 12, 2019 3:32 pm

เรียนอาจารย์
ผมลองเขียนสูตรดูแล้วครับโดยศึกษาจากเวปของอาจารย์
ผมเข้าใจว่าใน 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 11 times
ME 15812_02.xlsx
(221.46 KiB) Downloaded 10 times

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

#24

by snasui » Tue Sep 10, 2019 8:18 pm

:D ได้ลองปรับแก้มาเองแล้วหรือไม่ แก้เป็นอย่างไร แก้แล้วติดปัญหาตรงไหน อย่างไร ถ้ายังไม่ลองปรับมาเอง ให้ลองปรับมาก่อนครับ

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

#23

by nakhonchai » Tue Sep 10, 2019 6:47 pm

สวัสดีครับ อาจารย์
ผมมีเรื่องสอบถามครับ พอดีวันนี้ลูกน้องเพิ่งแจ้งมาว่า 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
ME15812 MOLD UPPER.xlsx
(17.5 KiB) Downloaded 9 times
ME15812 MOLD LOWER.xlsx
(20.91 KiB) Downloaded 10 times
ME 15812.xlsx
(221.46 KiB) Downloaded 11 times

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

#22

by logic » Fri Aug 30, 2019 2:44 pm

เครื่องหมาย ' ที่อาจารย์ใช้ในโค้ดคือตัวที่ทำให้โค้ดใช้การไม่ได้ เครื่องหมายนี้เอามานำหน้าคำอธิบายโค้ดกันครับ

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

#21

by nakhonchai » Fri Aug 30, 2019 8:54 am

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

แบบไม่มี

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

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

#20

by nakhonchai » Fri Aug 30, 2019 7:58 am

เรียนอาจารย์
เรื่องชื่อชีทผมผิดพลาดต้องขออภัยด้วยครับ ผมดูไม่รอบคอบเองครับ

หลังแก้ไขแล้ว ผมอลงใส่สูตรให้ดึงค่ามาแค่ชีทเดียว
สามารถ copy ข้อมูลมาได้แค่ 3 บรรทัด และมีข้อมูลอยู่ในชีทอื่นด้วยครับ
รบกวนอาจารย์ช่วยชี้แนะด้วยครับ
ข้อมูลเป็นดังเอกสารแนบครับ
ขอบคุณอารย์มากครับ
Attachments
Book.xlsx
(276.8 KiB) Downloaded 15 times
VBA Copy.xlsb
(18.23 KiB) Downloaded 14 times

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

#19

by snasui » Thu Aug 29, 2019 11:15 pm

:D ผมยังพบค่าวรรคหลังชือชีตครับ

เมื่อลบ - ออกจากชื่อชีตของไฟล์ Book.xlsx ค่าในคอลัมน์ D ของไฟล์ที่ลงท้ายด้วย Upper, Lower จะต้องลบ - ออกด้วยเช่นกัน ถ้ามี - ก็ต้องมีให้เหมือนกันครับ
Attachments
Space.png
Space.png (14.71 KiB) Viewed 490 times

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

#18

by nakhonchai » Thu Aug 29, 2019 10:24 pm

เรียนอาจารย์
ผมลองใส่ตามที่อาจารย์แนะนำ มันยังแจ้ง Error อยู่ครับ รบกวนช่วยชี้แนะด้วยครับ
***ไฟล์ Book ชื่อชีททุกชีทผมแก้ไม่มีเว้นวรรคแล้ว
ตามไฟล์แนบครับ

บรรทัดที่แสดง Error

Code: Select all


Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E98")

Attachments
Book.xlsx
(277.98 KiB) Downloaded 12 times
VBA Copy.xlsb
(18.28 KiB) Downloaded 15 times

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

#17

by snasui » Thu Aug 29, 2019 9:06 pm

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

Code: Select all

'Other code
With Workbooks("ME15812 LOWER.xlsx").Worksheets("LOWER")
    Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
    For i = 1 To rall.Count Step 8
'            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(3).Value = _
                rall(i).Offset(0, j).Resize(3).Value
            Set rt = rt.Offset(0, 1)
        Next j
    Next i     
'Other code   

End With

With Workbooks("ME15812 UPPER.xlsx").Worksheets("UPPER")
'Other code
:!: หมายเหตุ
  1. ไฟล์ Book แก้ชื่อชีตใหม่ทุกชีตห้ามมีวรรค
  2. ก่อนจะขึ้นไฟล์ Upper ใน Code ต้องปิดด้วย End With เสียก่อน

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

#16

by nakhonchai » Thu Aug 29, 2019 8:49 pm

ขอโทษอาจารย์ด้วยครับ ผมลืมเปลี่ยนชื่อไฟล์ให้สอดคล้องกัน
เมื่อผมกดให้ทำงาน ขึ้นหน้า Run-time Error '9': แล้วผมกดปุ่ม Debug จะฟ้องที่บรรทัดนี้ครับ
ขอบคุณอาจารย์มากๆครับ

Code: Select all

Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E98")
Attachments
ME15812 UPPER.xlsx
(22.73 KiB) Downloaded 13 times
ME15812 LOWER.xlsx
(28.1 KiB) Downloaded 19 times
Book.xlsx
(277.93 KiB) Downloaded 12 times

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

#15

by snasui » Thu Aug 29, 2019 7:22 pm

:D ตั้งชื่อไฟล์แนบให้สอดคล้องกับที่เขียนไว้ใน Code แล้วแนบมาใหม่อีกครั้งครับ Code ที่มีปัญหาเริ่มติดขัดที่บรรทัดใดกรุณาแจ้งมาด้วยจะได้เข้าถึงปัญหาโดยไวครับ

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

#14

by nakhonchai » Thu Aug 29, 2019 2:46 pm

ไฟล์ VBA ที่ลองแก้ไขครับ
Attachments
VBA Copy.xlsb
(18.27 KiB) Downloaded 15 times

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

#13

by nakhonchai » Thu Aug 29, 2019 2:45 pm

สวัสดีครับอาจารย์
ผมขอรบกวนขอคำชี้แนะเนื่องสูตร VBA ครับ
จากคราวก่อนที่อาจารย์ได้แนะนำสูตรการ Copy ไว้ให้ ผมลองมาแก้ไขเพิ่มเติม แต่ไม่สามารถทำงานได้
เนื่องจากมีเงื่อนไขเพิ่มเข้ามาครับ เงื่อนไขที่ว่า คือ ต้องการ Copy ข้อมูลจาก 2 ไฟล์มาไว้ที่ไฟล์เดียวกัน
ถ้าคอลัมน์ D ในไฟล์ Lower และ Upper เจอว่ามี M-5A จะนำข้อมูลที่ต้องการของแถว M-5A ไปใส่ที่ Sheet ชื่อ M-5A ในช่องที่กำหนดในไฟล์ Book
****ถ้าชื่อ Sheet เป็นลักษณะ M-5_9A แบบนี้สูตร VBA ทำได้มั้ยครับ
ผมได้แนบไฟล์ตัวอย่างการลงข้อมูลมาให้แล้วครับ และไฟล์ที่ลองแก้ไขแต่ไม่เวิร์ค 5555
#ขอบคุณมา ณ ที่นี้มากครับ

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 LOWER.xlsx").Worksheets("LOWER")
        Set rall = .Range("d2", .Range("d" & .Rows.Count).End(xlUp))
        For i = 1 To rall.Count Step 8
            shStr = Replace(rall(i).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E98")
            For j = 4 To 4
                            rt.Resize(3).Value = _
                    rall(i).Offset(0, j).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next j
        Next i
         
        For k = 1 To rall.Count Step 8
            shStr = Replace(rall(k).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("H108")
            For l = 5 To 7
                rt.Resize(3).Value = _
                    rall(k).Offset(0, l).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next l
        Next k
        
        For m = 1 To rall.Count Step 8
            shStr = Replace(rall(m).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E117")
            For n = 10 To 15
                rt.Resize(3).Value = _
                    rall(m).Offset(0, n).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next n
        Next m
        
        For o = 1 To rall.Count Step 8
            shStr = Replace(rall(o).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E126")
            For p = 17 To 22
                rt.Resize(3).Value = _
                    rall(o).Offset(0, p).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next p
        Next o
        
        
        With Workbooks("ME15812 UPPER.xlsx").Worksheets("UPPER")
        For q = 1 To rall.Count Step 8
            shStr = Replace(rall(q).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E108")
            For r = 4 To 6
                rt.Resize(3).Value = _
                    rall(q).Offset(0, r).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next r
        Next q
        
            For v = 1 To rall.Count Step 8
            shStr = Replace(rall(v).Value, "M", " M")
            shStr = Replace(shStr, "-", "")
            Set rt = Workbooks("Book.xlsx").Worksheets(shStr).Range("E162")
            For w = 7 To 9
                rt.Resize(3).Value = _
                    rall(v).Offset(0, w).Resize(3).Value
                Set rt = rt.Offset(0, 1)
            Next w
        Next v
               
        End With

End Sub

Attachments
Book.xlsx
(277.93 KiB) Downloaded 14 times
UPPER.xlsx
(22.73 KiB) Downloaded 13 times
LOWER.xlsx
(28.1 KiB) Downloaded 13 times

Top