: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 Source and 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

ใช้ vba Source and Copy

#1

Post by Totem »

:D เรียนอาจารย์และเพื่อนสมาชิก

การค้นหาและคัดลอก โดยมาหลักดังนี้
ต้องการให้หารายการในช่อง H2:H7
เมื่อข้อมูลตรงกับในช่อง A2:A20
ให้คัดลอกรายการในช่อง I2:I7
ไปวางไว้ในช่อง E2:E20
ตัวอย่าง เช่น รายการ aa ในช่อง H1 ตรงกับช่อง A2 , A4 ให้นำรายการในช่อง I2 คือ กก1 คัดลอกไปวางไว้ในช่อง E2 , E5 เป็นต้น
ค้นหาแบบนี้จนครบทุกรายการในช่อง H2 : H7
code นี้ ผมศึกษาจะกระทู้อื่นใน web นี้ จะนำไปปรับใช้แล้ว ติดปัญหา ขอให้ช่วยปรับ code vba ครับ

Code: Select all

    Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("A" & Rows.Count).End(xlUp))
    End With
    With Sheets("data")
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With

    For Each rs In rSource
        For Each rt In rTarget
            If rt = rs Then rt.Offset(0, 4) = .Range("I2", .Range("I" & Rows.Count).End(xlUp))
        Next rt
    Next rs
    
    Exit Sub
    
    End Sub
ติดตรงบรรทัดนี้ครับ

Code: Select all

 If rt = rs Then rt.Offset(0, 4) = .Range("I2", .Range("I" & Rows.Count).End(xlUp))
ขอความกระจ่างครับ

ขอบคุณครับ
SourceAndCopy.xlsm
(15 KiB) Downloaded 20 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 Source and Copy

#2

Post by snasui »

Totem wrote:จะนำไปปรับใช้แล้ว ติดปัญหา ขอให้ช่วยปรับ code vba ครับ
:D คำว่าจะนำไปปรับใช้ ไม่ถือว่าปรับมาแล้ว ลองปรับที่ผมระบายสีมาเองก่อน ติดแล้วแจ้งมาอีกทีครับ

Set rSource = .Range("H2", .Range("[color=#FF4000]A[/color]" & Rows.Count).End(xlUp)) กับ
= [color=#FF4000].Range("I2", .Range("I" & Rows.Count).End(xlUp))[/color]
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#3

Post by Totem »

snasui wrote:
Totem wrote:จะนำไปปรับใช้แล้ว ติดปัญหา ขอให้ช่วยปรับ code vba ครับ
:D คำว่าจะนำไปปรับใช้ ไม่ถือว่าปรับมาแล้ว ลองปรับที่ผมระบายสีมาเองก่อน ติดแล้วแจ้งมาอีกทีครับ

Set rSource = .Range("H2", .Range("[color=#FF4000]A[/color]" & Rows.Count).End(xlUp)) กับ
= [color=#FF4000].Range("I2", .Range("I" & Rows.Count).End(xlUp))[/color]
:D ได้ลองปรับแล้วแต่ยังไม่ตรงตามที่ต้องการครับ ยังไม่สามารถคัดลอกเรียงลำดับตามรายการในช่อง I2 : I5 ได้เป็น กก1 ทุกช่องในคอลัมน์ E2:E6 , E14,E19

Code: Select all

    Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("H" & Rows.Count).End(xlUp))
    End With
    With Sheets("data")
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With

    For Each rs In rSource
        For Each rt In rTarget
            If rt = rs Then rt.Offset(0, 4) = Range("I2", Range("I2").End(xlDown)).Rows.Value
        Next rt
    Next rs
    
    Exit Sub
    
    End Sub
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ใช้ vba Source and Copy

#4

Post by DhitiBank »

เกือบได้แล้วครับ ลองปรับโค้ดเป็นแบบนี้ครับ

Code: Select all

Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("H" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
        For Each rs In rSource
            For Each rt In rTarget
                If rt = rs Then rt.Offset(0, 4) = rs.Offset(0, 1)
            Next rt
        Next rs
End Sub
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: ใช้ vba Source and Copy

#5

Post by bank9597 »

Dim rSource As Range
Dim rTarget As Range
Dim rs As Range
Dim rt As Range

With Sheets("data")
Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

For Each rt In rtarget
For Each rs In rsource
If rt = rs Then
rt.Offset(0, 4)=rs.offset(0,1)
End if
Next rs
Next rt

ผมตอบผ่านสมาร์โฟน ลองดูครับ
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#6

Post by Totem »

DhitiBank wrote:เกือบได้แล้วครับ ลองปรับโค้ดเป็นแบบนี้ครับ

Code: Select all

Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("H" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
        For Each rs In rSource
            For Each rt In rTarget
                If rt = rs Then rt.Offset(0, 4) = rs.Offset(0, 1)
            Next rt
        Next rs
End Sub
ตอนแรกผมปรับเป็น

Code: Select all

If rt = rs Then rt.Offset(0, 4) = rs.Offset(0, 8)
เลยเป็นค่าว่าง ผมยังสับสนกับ Offset ตรง column ว่าจะต้องอยู่ตรงตำแหน่ง 8 คือ I2:I8 เพราะเข้าใจว่านับจาก A2 ไปถึง I2 :(

ถ้าอธิบายให้พอสังเขปจะดีมากเลยครับ

Code: Select all

rIf rt = rs Then rt.Offset(0, 4) = rs.Offset(0, 1)
ใช้ได้ตามต้องการเลยครับ ขอบคุณครับ
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ใช้ vba Source and Copy

#7

Post by DhitiBank »

ผมจำแบบนี้ครับ

Offset(จำนวนแถวที่เลื่อน,จำนวนคอลัมน์ที่เลื่อน)

rs.offset(0,1)
หมายความว่า เซลล์ที่ขยับจากเรนจ์ rs ไปทางขวาเป็นระยะ 1 คอลัมน์ครับ :)

:arrow: หากตัวเลขเป็นบวก ทิศทางจะเลื่อนลง หรือไปทางขวา

:arrow: หากตัวเลขเป็นลบ ทิศทางจะเลื่อนขึ้น หรือไปทางซ้าย

:arrow: หากเป็น 0 ก็จะไม่มีการเลื่อนในแกนนั้นๆ ครับ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#8

Post by Totem »

DhitiBank wrote:ผมจำแบบนี้ครับ

Offset(จำนวนแถวที่เลื่อน,จำนวนคอลัมน์ที่เลื่อน)

rs.offset(0,1)
หมายความว่า เซลล์ที่ขยับจากเรนจ์ rs ไปทางขวาเป็นระยะ 1 คอลัมน์ครับ :)

:arrow: หากตัวเลขเป็นบวก ทิศทางจะเลื่อนลง หรือไปทางขวา

:arrow: หากตัวเลขเป็นลบ ทิศทางจะเลื่อนขึ้น หรือไปทางซ้าย

:arrow: หากเป็น 0 ก็จะไม่มีการเลื่อนในแกนนั้นๆ ครับ
:D จากตัวอย่าง จะเริ่มต้นที่ In rSource คือ H2 เป็น offset (0,0) จากนั้นเลื่อนไปทางขวา นับจากช่อง H2 ไปที่ I2 คือ rs.offset (0,1) ผมเข้าใจอย่างนี้ถูกต้องใช่ไหมครับ :)

ผมไม่ค่อยเข้าใจว่าจะเริ่มต้นนับตั้งแต่ตรงไหนเป็น offset (0,0)
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ใช้ vba Source and Copy

#9

Post by DhitiBank »

อธิบายจากโค้ดตรงช่วง Loop นะครับ

:arrow: For Each rs In rSource
--rSource คือค่าในคอลัมน์ H เริ่มตั้งแต่ H2:H7 เราจะให้ตัวแปร rs แทนเรนจ์แต่ละค่าใน rSource นี้
--เริ่มแรก rs คือเซลล์ H2 ครับ

:arrow: For Each rt In rTarget
--rTarget คือช่วงในคอลัมน์ A โดยให้ตัวแปร rt แทนเรนจ์แต่ละค่าใน rTarget
--rt ค่าแรกคือเรนจ์ A2 ซึ่งมีค่าเท่ากับ aa

:arrow: If rt = rs Then rt.Offset(0, 4) = rs.Offset(0, 1)
--เงื่อนไขคือ หาก rt=rs ก็ให้ค่าในเซลล์ E2 (rt.offset(0,4) คือเซลล์ที่อยู่ถัดจาก rt ไปทางขวา 4 คอลัมน์) มีค่าเท่ากับเซลล์ I2 (rs.offset(0,1) คือเซลล์ที่อยู่ถัดจาก rs ไปทางขวา 1 คอลัมน์ครับ)
--แต่หากไม่เท่ากันก็จะข้าม Then ไปเลย แล้ว rt ก็จะวิ่งต่อไปยัง A3, A4, ... ไปเรื่อยๆ จนครบช่วง rTarget
--พอครบ loop ของ rt แล้วก็จะเริ่มวน loop ของ rs ตัวถัดไปครับ วนไปเรื่อยๆ จนครบทุกเรนจ์ใน rSource

งงไหมครับ ผมอธิบาย vba ไม่ค่อยเก่งเพราะเรียนแบบจำจากที่อื่นๆ มา ยังไม่ค่อยรู้ว่าจริงๆ แล้วแต่ละส่วนต้องเรียกว่าอะไรครับ ลองรันโค้ดทีละขั้นตอนโดยการกด F8 แล้วดูทีละขั้นครับว่าโค้ดทำงานอย่างไรตรงไหนบ้าง
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#10

Post by Totem »

:D ขอบคุณครับ

ถ้าหากมีเงื่อนไขเพิ่มเติม เช่น

ต้องการให้หารายการในช่อง H2:H7 และ I2:I7
เมื่อข้อมูลตรงกับในช่อง A2:A20 และ C2:C20
ให้คัดลอกรายการในช่อง J2:J7
ไปวางไว้ในช่อง E2:E20
หากรายการในช่อง H2:H7 และ I2:I7 ไม่ตรงกันกับ ในช่อง A2:A20 และ C2:C20
ไม่ต้องคัดลอกรายการในช่อง J2:J7
พอปรับ code ได้ไหมครับ

ขอบคุณครับ
SourceAndCopy_เพื่มเติม.xlsm
(16.96 KiB) Downloaded 25 times
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ใช้ vba Source and Copy

#11

Post by DhitiBank »

ปรับได้ครับ แต่คงต้องขอให้ลองปรับมาเองก่อนครับ :tt:
คำใบ้:

ตรงแถวๆ IF จะมี AND
niwat2811
Bronze
Bronze
Posts: 350
Joined: Thu Jan 06, 2011 12:51 pm
Excel Ver: 2016

Re: ใช้ vba Source and Copy

#12

Post by niwat2811 »

ลองแบบนี้ดูว่าใช้ได้ตามต้องการไหมครับ

Code: Select all

Sub Match_Data()
Dim lr As Long, i As Long
Dim x As Range
Application.ScreenUpdating = False
lr = Range("A" & Rows.Count).End(xlUp).Row
On Error Resume Next
For i = 2 To lr
    Set x = Range("H:H").Find(Cells(i, "A").Value)
    If Not x Is Nothing Then
        Range("C" & i).Value = Range("I" & x.Row).Value
        Range("E" & i).Value = Range("J" & x.Row).Value
    End If
Next i
Range("A1").Select
Application.ScreenUpdating = True
End Sub
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 Source and Copy

#13

Post by snasui »

:D คุณ niwat12811 ควรรอให้คุณ Totem ปรับมาเองก่อน แล้วค่อยช่วยปรับแก้ให้ในภายหลัง คุณ Totem จะได้มีประสบการณ์ในการทำงานกับ VBA ครับ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#14

Post by Totem »

niwat2811 wrote:ลองแบบนี้ดูว่าใช้ได้ตามต้องการไหมครับ

Code: Select all

Sub Match_Data()
Dim lr As Long, i As Long
Dim x As Range
Application.ScreenUpdating = False
lr = Range("A" & Rows.Count).End(xlUp).Row
On Error Resume Next
For i = 2 To lr
    Set x = Range("H:H").Find(Cells(i, "A").Value)
    If Not x Is Nothing Then
        Range("C" & i).Value = Range("I" & x.Row).Value
        Range("E" & i).Value = Range("J" & x.Row).Value
    End If
Next i
Range("A1").Select
Application.ScreenUpdating = True
End Sub
:D ขอบคุณครับ

ยังไม่ได้ตามที่ต้องการครับ เพราะว่า ข้อมูลช่อง C2 และ C10 ไม่ตรงกับ I2 และ I3 เมื่อไม่ตรงกัน

ฉะนั้น ช่อง E4 และ E10 ยังคงเป็นข้อมูลเดิม ไม่ต้องคัดลอก J2 และ J3 ไป ครับ
Last edited by Totem on Thu Aug 13, 2015 2:37 pm, edited 1 time in total.
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 Source and Copy

#15

Post by snasui »

:D ลองปรับมาเองก่อนครับ ติดแล้วค่อยถามกันต่อ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#16

Post by Totem »

snasui wrote::D คุณ niwat12811 ควรรอให้คุณ Totem ปรับมาเองก่อน แล้วค่อยช่วยปรับแก้ให้ในภายหลัง คุณ Totem จะได้มีประสบการณ์ในการทำงานกับ VBA ครับ
:D ขอบคุณครับ คุณ niwat12811 เดี๋ยวจะลองปรับดูครับ
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: ใช้ vba Source and Copy

#17

Post by bank9597 »

Totem wrote:
snasui wrote::D คุณ niwat12811 ควรรอให้คุณ Totem ปรับมาเองก่อน แล้วค่อยช่วยปรับแก้ให้ในภายหลัง คุณ Totem จะได้มีประสบการณ์ในการทำงานกับ VBA ครับ
:D ขอบคุณครับ คุณ niwat12811 เดี๋ยวจะลองปรับดูครับ
:?: ได้ลองปรับโค๊ดที่ผมได้ตอบหรือยังครับ :ard:

Code: Select all

Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    For Each rt In rTarget
        For Each rs In rSource
            If rt = rs Then
                rt.Offset(0, 4) = rs.Offset(0, 1)
            End If
        Next rs
    Next rt
    
    Set rSource = Nothing
    Set rTarget = Nothing

End Sub
อ่านหลักการใช้ Offset ตามที่คุณ DhitiBank (ค่อนข้างเข้าใจง่าย)
และใช้ And เพิ่มเงื่อนไขก็จะสามารถแก้ปัญหาได้แล้วครับ
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#18

Post by Totem »

bank9597 wrote:
Totem wrote:
snasui wrote::D คุณ niwat12811 ควรรอให้คุณ Totem ปรับมาเองก่อน แล้วค่อยช่วยปรับแก้ให้ในภายหลัง คุณ Totem จะได้มีประสบการณ์ในการทำงานกับ VBA ครับ
:D ขอบคุณครับ คุณ niwat12811 เดี๋ยวจะลองปรับดูครับ
:?: ได้ลองปรับโค๊ดที่ผมได้ตอบหรือยังครับ :ard:

Code: Select all

Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    For Each rt In rTarget
        For Each rs In rSource
            If rt = rs Then
                rt.Offset(0, 4) = rs.Offset(0, 1)
            End If
        Next rs
    Next rt
    
    Set rSource = Nothing
    Set rTarget = Nothing

End Sub
อ่านหลักการใช้ Offset ตามที่คุณ DhitiBank (ค่อนข้างเข้าใจง่าย)
และใช้ And เพิ่มเงื่อนไขก็จะสามารถแก้ปัญหาได้แล้วครับ
:D ตาม code ที่ให้มานั้น ได้ตามต้องการตามปัญหาแรกครับ ขอบคุณครับ

ลองปรับใหม่ตามปัญหาต่อมา ได้ดังนี้ครับ

Code: Select all

Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    For Each rt In rTarget
        For Each rs In rSource
            If rt = rs And rt.Cells(1, "C").Value = rt.Cells(1, "I").Value Then
                rt.Offset(0, 4) = rs.Offset(0, 1)
            End If
        Next rs
    Next rt
    
    Set rSource = Nothing
    Set rTarget = Nothing

End Sub
ยังติดปัญหาที่ เมื่อวนไปถึงตั้งแต่ ช่อง E5 ลงมายังไม่นำข้อมูลช่อง I4 มาวาง ครับ
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: ใช้ vba Source and Copy

#19

Post by bank9597 »

ลองโค๊ดนี้ดูครับ

Code: Select all

Option Explicit
Public Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    For Each rt In rTarget
        For Each rs In rSource
            If rt = rs And rt.Offset(0, 2) = rs.Offset(0, 1) Then
                rt.Offset(0, 4) = rs.Offset(0, 2)
            End If
        Next rs
    Next rt
    
    Set rSource = Nothing
    Set rTarget = Nothing

End Sub
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
Totem
Silver
Silver
Posts: 650
Joined: Fri Oct 11, 2013 7:52 pm
Excel Ver: 365 , 2007

Re: ใช้ vba Source and Copy

#20

Post by Totem »

bank9597 wrote:ลองโค๊ดนี้ดูครับ

Code: Select all

Option Explicit
Public Sub SourceAndCopy()
    Dim rSource As Range
    Dim rTarget As Range
    Dim rs As Range
    Dim rt As Range
    
    With Sheets("data")
        Set rSource = .Range("H2", .Range("h" & Rows.Count).End(xlUp))
        Set rTarget = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    For Each rt In rTarget
        For Each rs In rSource
            If rt = rs And rt.Offset(0, 2) = rs.Offset(0, 1) Then
                rt.Offset(0, 4) = rs.Offset(0, 2)
            End If
        Next rs
    Next rt
    
    Set rSource = Nothing
    Set rTarget = Nothing

End Sub
:D ขอบคุณครับ คุณbank9597

ได้ตามที่ต้องการ พอเข้าใจวิธีการทำงานบ้างแล้วครับ

:D ขอบคุณ อาจารย์และเพื่อนสมาชิกที่ช่วยแก้ไขให้ครับ :D :idea:
Post Reply