: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

ต่อเนื่องจาก Vlook ด้วย 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

ต่อเนื่องจาก Vlook ด้วย VBA

#1

Post by akung »

จากกระทู้นี้ครับ http://www.snasui.com/viewtopic.php?f=3&t=3179&start=20 ผมจึงมีแนวคิดมารบกวนอาจารย์อีกแล้วครับ คือผมคิดว่าในเมือ VBA สามารถทำงานลักษณะ Vlookup ได้ VBA ก็น่าจะสามารถดึงข้อมูลการ เหมือน Index + Match ได้เหมือนกัน แต่พยายามลองทำดูแล้วข้อมูลก็ไม่ยอมมาอย่างทีคิด คิดมาทั้งวันคิดไม่ออก เขียนไปไกลพอสมควร จนมั่วไปหมด สุดท้ายเลยกลับมาเริ่มที่จุดเริ่มต้นใหม่อีกครั้ง รบกวนอาจารย์ชี้แนะด้วยครับ
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: ต่อเนื่องจาก Vlook ด้วย VBA

#2

Post by snasui »

:D ช่วยโพสต์ Code ที่ได้ลองแล้วพร้อมไฟล์แนบมาด้วยครับ
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

Re: ต่อเนื่องจาก Vlook ด้วย VBA

#3

Post by akung »

snasui wrote::D ช่วยโพสต์ Code ที่ได้ลองแล้วพร้อมไฟล์แนบมาด้วยครับ
ขอโทษครับ :oops: ลืมแนบซะงั้น :tt:
Attachments
Vlookup_VBA_ข้อมูลมากกว่า1.xls
(36.5 KiB) Downloaded 21 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: ต่อเนื่องจาก Vlook ด้วย VBA

#4

Post by snasui »

:D ลองดูตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

With Application
'    Amount = Application.VLookup(r, Rng, ColAmount, 0)
'    Name = Application.VLookup(r, Rng, ColName, 0)
     Amount = .Index(Rng.Offset(0, 2).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
     Name = .Index(Rng.Offset(0, 1).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
End With
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

Re: ต่อเนื่องจาก Vlook ด้วย VBA

#5

Post by akung »

snasui wrote::D ลองดูตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

With Application
'    Amount = Application.VLookup(r, Rng, ColAmount, 0)
'    Name = Application.VLookup(r, Rng, ColName, 0)
     Amount = .Index(Rng.Offset(0, 2).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
     Name = .Index(Rng.Offset(0, 1).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
End With
ขอบคุณครับอาจารย์
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

Re: ต่อเนื่องจาก Vlook ด้วย VBA

#6

Post by akung »

สูตรที่อาจารย์ใบ้มาให้ ผมก็ยังตีไม่แตก :oops:

แต่คิดไปเรื่อย ๆ เอาตัวอย่างโน้นนี้มาใส่ คิดว่าน่าจะได้แล้วกลับไม่ได้ ไม่รู้ว่าเพราะอะไร รบกวนอาจารย์ช่วยชี้แนะหน่อยครับ สูตรใหม่ที่คิดอยู่ใน Sheets SeekList ครับ ขอบคุณครับ
Attachments
Vlookup_VBA_ข้อมูลมากกว่า1.xls
(46.5 KiB) Downloaded 21 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: ต่อเนื่องจาก Vlook ด้วย VBA

#7

Post by snasui »

:D Code นั้นไม่ได้ใบ้ครับ ต้องนำไปใส่ตามนั้น

ส่วนที่บอกว่าไม่ได้ ยังติดอะไร ช่วยอธิบายรายละเอียดพร้อมวิธีทดสอบให้เกิดปัญหาเช่นนั้นมาด้วยครับ
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

Re: ต่อเนื่องจาก Vlook ด้วย VBA

#8

Post by akung »

snasui wrote::D Code นั้นไม่ได้ใบ้ครับ ต้องนำไปใส่ตามนั้น

ส่วนที่บอกว่าไม่ได้ ยังติดอะไร ช่วยอธิบายรายละเอียดพร้อมวิธีทดสอบให้เกิดปัญหาเช่นนั้นมาด้วยครับ

Code: Select all

Private Sub CommandButton1_Click()
    Dim LookFor As Range
    Dim Rng As Range
    Dim ColAmount As Integer
    Dim ColName As Integer
    Dim Amount As Variant
    Dim Name As Variant
    Dim rAll As Range
    Dim r As Range
    
    Set LookFor = Sheets("Sheet2").Range("A1")
    Set Rng = Sheets("Data").Columns("A:C")
    With Sheets("Sheet2")
        Set rAll = .Range("A1", .Range("A" & Rows.Count).End(xlUp))
    End With
    
    ColName = 2
    ColAmount = 3
    
    
    On Error Resume Next
    For Each r In rAll
        With Application
            'Amount = Application.VLookup(r, Rng, ColAmount, 0)
            'Name = Application.VLookup(r, Rng, ColName, 0)
            Amount = .Index(Rng.Offset(0, 2).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
            Name = .Index(Rng.Offset(0, 1).Resize(, 1), .Match(r, Rng.Resize(, 1), 0))
        End With
        
        
        If IsError(Amount) Then
            MsgBox r.Offset(0, 0) & "  ไม่มียอดเงินในฐานข้อมูล"
        Else
            r.Offset(0, 2) = Amount
            r.Offset(1, 2) = Amount
        End If
        
        If IsError(Name) Then
            'MsgBox r.Offset(0, 0) & "  ไม่มีชื่อลูกค้าในฐานข้อมูล"
            'r.Offset(0, 0) = "" 'ทำให้ข้อมูลในบรรทัดสุดใน Colum A เป็น ว่าง
            'r.Offset(0, 0).Activate
        Else
            r.Offset(0, 1) = Name
            r.Offset(1, 1) = Name
        End If
    Next r
    On Error GoTo 0
End Sub

ผมเอา Code ที่อาจารย์ให้ไปใส่แทน Code Vlookup ครับ
แล้วผมก็ใส่ เลข 12345 ที่ A1 แล้วกดปุ่ม
ข้อมูลที่ต้องการควรจะเป็น

12345 นาย ก. 100
นาย ก. 250
นาย ก. 300

แต่มันออกแค่

12345 นาย ก. 100 แค่นั้นครับ
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: ต่อเนื่องจาก Vlook ด้วย VBA

#9

Post by snasui »

:D ควรจะเขียนอธิบายสิ่งที่ต้องการมาเช่นนี้เสมอจะได้เข้าใจตรงกัน Vlookup หรือ Indirect+Match ไม่สามารถ Loop เพื่อนำทุกค่าที่ตรงกับค่าเป้าหมายมาแสดงได้ เพราะจะเจอตัวแรกอยู่เสมอไป

ตัวอย่างการ Loop เพื่อนำค่าที่ตรงกับค่าเป้าหมายมาแสดงทั้งหมดตามด้านล่างครับ

Code: Select all

Sub test0()
    Dim rSoruce As Range, rs As Range
    Dim rTarget As Range
    With Sheets("Data")
        Set rsource = .Range("A2", _
            .Range("A" & Rows.Count).End(xlUp))
    End With
    Set rTarget = Sheets("Sheet2").Range("A1")
    For Each rs In rsource
        If rs = rTarget Then
            With Sheets("Sheet2")
                If .Range("B1") = "" Then
                    .Range("B" & Rows.Count) _
                        .End(xlUp) = rs.Offset(0, 1)
                    .Range("C" & Rows.Count) _
                        .End(xlUp) = rs.Offset(0, 2)
                Else
                    .Range("B" & Rows.Count) _
                        .End(xlUp).Offset(1, 0) = rs.Offset(0, 1)
                    .Range("C" & Rows.Count) _
                        .End(xlUp).Offset(1, 0) = rs.Offset(0, 2)
                End If
            End With
        End If
    Next rs
End Sub
akung
Member
Member
Posts: 159
Joined: Sun Mar 11, 2012 10:20 am

Re: ต่อเนื่องจาก Vlook ด้วย VBA

#10

Post by akung »

snasui wrote::D ควรจะเขียนอธิบายสิ่งที่ต้องการมาเช่นนี้เสมอจะได้เข้าใจตรงกัน Vlookup หรือ Indirect+Match ไม่สามารถ Loop เพื่อนำทุกค่าที่ตรงกับค่าเป้าหมายมาแสดงได้ เพราะจะเจอตัวแรกอยู่เสมอไป

ตัวอย่างการ Loop เพื่อนำค่าที่ตรงกับค่าเป้าหมายมาแสดงทั้งหมดตามด้านล่างครับ

Code: Select all

Sub test0()
    Dim rSoruce As Range, rs As Range
    Dim rTarget As Range
    With Sheets("Data")
        Set rsource = .Range("A2", _
            .Range("A" & Rows.Count).End(xlUp))
    End With
    Set rTarget = Sheets("Sheet2").Range("A1")
    For Each rs In rsource
        If rs = rTarget Then
            With Sheets("Sheet2")
                If .Range("B1") = "" Then
                    .Range("B" & Rows.Count) _
                        .End(xlUp) = rs.Offset(0, 1)
                    .Range("C" & Rows.Count) _
                        .End(xlUp) = rs.Offset(0, 2)
                Else
                    .Range("B" & Rows.Count) _
                        .End(xlUp).Offset(1, 0) = rs.Offset(0, 1)
                    .Range("C" & Rows.Count) _
                        .End(xlUp).Offset(1, 0) = rs.Offset(0, 2)
                End If
            End With
        End If
    Next rs
End Sub
ขอบคุณครับ ผมจะค่อยแกะดูครับ :D
Post Reply