Page 1 of 1

สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Thu Sep 08, 2016 4:30 pm
by vichaim
คือผมให้โปรแกรมตรวจสอบว่า ที่ User มีการคีย์เข้ามาในระบบ มีเลขบัญชีนี้หรือไม่ ถ้ามีให้นำ Record ล่าสุดมาแสดงว่าได้ดำเนินการไปเมื่อวันที่เท่าไร
ตาม Code นี้ครับ

MsgBox ("ลูกค้าเคยขอข้อมูลเมื่อวันที่ " & Format(Application.VLookup(Target, Rng1, DateB, 0), "dd/mm/yyyy") & " " & Application.VLookup(Target, Rng1, ColNameE, 0))

แต่พอมีข้อมูลมากกว่า 1 Record ระบบก็จะดึงข้อมูลแรกมาให้ซึ่งไม่ถูกต้องตามที่ต้องการครับ ผมควรจะคำสั่งอะไรสำหรับกรณีแบบนี้ดีครับ ขอบคุณครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Thu Sep 08, 2016 4:38 pm
by snasui
:D การโพสต์ Code ให้อ่านวิธีการตามกฎการใช้บอร์ดข้อ 5 ด้านบนเพื่อสะดวกต่อการอ่านครับ

สำหรับการ Lookup รายการสุดท้ายด้วยฟังก์ชั่น Vlookup ให้เปลี่ยนเลข 0 (ส่วนประกอบสุดท้าย ใน Vlookup) ให้เป็น 1 หรือลบทิ้งไปครับ

เมื่อกำหนดเช่นนี้ การที่จะได้รายการสุดท้ายมานั้นมีข้อกำหนดว่า คอลัมน์แรกของ Rng1 จะต้องเรียงจากน้อยไปหามากเท่านั้นครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Thu Sep 08, 2016 5:39 pm
by vichaim
ขอบคุณครับ เดี่ยวจะลองดูครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Thu Sep 08, 2016 5:42 pm
by vichaim
ไม่ได้คับ เอาข้อมูลของ Record อื่นมาแทนครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Thu Sep 08, 2016 6:05 pm
by snasui
:D แนบไฟล์พร้อมแสดงตัวอย่างคำตอบที่ถูกต้องมาด้วยจะได้เข้าใจตรงกันว่ากำลังจะทำอะไร ที่ชีตใด เซลล์ใด อย่างไร เช่นนี้เป็นต้นครับ

Re:ขอสูตรอัตราการคำนวณภาษีเงินได้ ปี 2558-2559

Posted: Thu Sep 08, 2016 8:09 pm
by Politic
อัตราภาษี
0-150000 ยกเว้น
150000-300000 5%
300000-500000 10%
500000-750000 15%
750000-1000000 20%
1000000-2000000 25%
2000000-4000000 30%
4000000 ขึ้นไป 35%

Re: Re:ขอสูตรอัตราการคำนวณภาษีเงินได้ ปี 2558-2559

Posted: Thu Sep 08, 2016 8:25 pm
by snasui
Politic wrote:อัตราภาษี
0-150000 ยกเว้น
150000-300000 5%
300000-500000 10%
500000-750000 15%
750000-1000000 20%
1000000-2000000 25%
2000000-4000000 30%
4000000 ขึ้นไป 35%
:D คำถามนี้ไม่เกียวกับกระทู้เดิม ให้ตั้งกระทู้ใหม่ครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Fri Sep 09, 2016 5:52 pm
by vichaim
จากตัวอย่างถ้าพิมพ์ 123457 จะต้องได้ ข้อความเป็นวันที่ 04/08/2016 แต่ระบบไปดึง Record แรกมากลายเป็น 03/08/2016 ซึ่งผิดครับ รบกวนด้วยครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Fri Sep 09, 2016 7:37 pm
by snasui
:D คุณ vichaim ยังไม่ได้ทำตามที่ผมแจ้งไปตามด้านล่างครับ
snasui wrote: :D สำหรับการ Lookup รายการสุดท้ายด้วยฟังก์ชั่น Vlookup ให้เปลี่ยนเลข 0 (ส่วนประกอบสุดท้าย ใน Vlookup) ให้เป็น 1 หรือลบทิ้งไปครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Fri Sep 09, 2016 9:56 pm
by vichaim
ผมทำแล้วทดสอบไปแล้วครับ ทั้ง 2 แบบ คือ เป็น 0 และลบทิ้ง ก็ไม่ได้ตามที่ต้องการครับ ผมเลยส่ง Code เดิมที่เขียนไว้แต่แรกมาให้ดูครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Fri Sep 09, 2016 9:58 pm
by snasui
:D หากเป็นเช่นนั้นให้ลบ 0 ใน Vlookup ทิ้งทั้งหมด ทดสอบแล้วส่งมาใหม่อีกรอบครับ

การที่ลบ 0 ทิ้งแล้วยังได้ค่าแรกย่อมผิดปกติ ผิดหลักการทำงานของ Vlookup ครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Mon Sep 12, 2016 5:21 pm
by vichaim
ทำการลบ 0 ด้านหลังออกแล้วครับ แต่ข้อมูลที่ได้ก็ยังไม่ถูกต้องครับ
จากการทดสอบเหมือนว่า เอา 0 ออกแล้วมันจะดึงข้อมูล Record ที่ 3 มาแสดง ถ้ามามีมากกว่านั้นจะผิดทันทีครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Mon Sep 12, 2016 9:15 pm
by snasui
:D เนื่องจาก Rng1 ไม่เป็นไปตามกฎด้านล่างครับ
snasui wrote:สำหรับการ Lookup รายการสุดท้ายด้วยฟังก์ชั่น Vlookup ให้เปลี่ยนเลข 0 (ส่วนประกอบสุดท้าย ใน Vlookup) ให้เป็น 1 หรือลบทิ้งไปครับ

เมื่อกำหนดเช่นนี้ การที่จะได้รายการสุดท้ายมานั้นมีข้อกำหนดว่า คอลัมน์แรกของ Rng1 จะต้องเรียงจากน้อยไปหามากเท่านั้นครับ
ตัวอย่างการปรับ Code

Code: Select all

'Other code
lng1 = Application.CountIf(Rng1.Resize(, 1), Target)
If lng1 >= 1 Then ' ตรวจสอบข้อมูลเดิมว่าเคยขอหรือเปล่า
    For i = Rng1.Columns(1).Rows.Count To 1 Step -1
       If Rng1.Columns(1).Cells(i) = Target Then
            a = Rng1.Columns(1).Cells(i).Offset(0, 3).Value
            Exit For
       End If
    Next i
    MsgBox ("ลูกค้าเคยขอข้อมูลเมื่อวันที่  " & Format(a, "dd/mm/yyyy"))
 'Other code
Other code หมายถึง code เดิมครับ

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Tue Sep 13, 2016 10:57 am
by menem
เท่าที่ทดลองทำดู ผมไม่สามารถทำให้ VBA ใช้งาน WorksheetFunction Lookup ได้เลย
โดยจะขึ้น Type Mismatch ตลอดเวลา
เลยตัดสินใจเปลี่ยนจากการให้ทำงานใน VBA ทั้งหมด มาเป็นอาศัย Cell บน Worksheet ทำงาน
ในส่วนนี้แทน ( ฝากไว้ที่ Cell : L1 )

หมายเหตุ : ผมไม่แน่ใจว่าช่อง Eng Name จะสื่ออะไรหรือไม่ก็เลยแก้ไข Code ในการดึงนิดหน่อย
แต่ถ้าไม่ใช่ประเด็น จะใช้ Code เดิมก็ได้ครับ

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Rng As Range
    Dim Rng1 As Range
    Dim Rng2 As Range
    Dim Rng3 As Range
    Dim rCheck As Range
    Dim ColName As Integer
    Dim ColNameE As Integer
    Dim DateB As Integer 'Çѹ·Õè¢ÍàÍ¡ÊÒÃ
    Dim Max As Integer

    
    Dim lng As Long
    Dim lng1 As Long
    
    If Target.Count > 1 Then Exit Sub
         If Target.Column = 3 Then
         
            TRow = Target.Row - 1
        
            With Sheets("AddData")
                Set rCheck = .Range("A1", .Range("A" & Rows.Count).End(xlUp))
            End With
        
            With Sheets("Data")
                Set Rng = .Range("A1", .Range("D" & Rows.Count).End(xlUp)) 'Range D ¤×Í Column ÊØ´·éÒ·Õè´Ö§
            End With
            
            With Sheets("AddData")
                Set Rng1 = .Range("C1", .Range("F" & Rows.Count).End(xlUp)) '´Ö§ Column C ¶Ö§ F
            End With
            
            With Sheets("AddData")
                Set Rng2 = .Range("C1:C" & TRow) '´Ö§ Column C ÁÒ 1 Column
            End With
            
            With Sheets("AddData")
                Set Rng3 = .Range("F1:F" & TRow) '´Ö§ Column F ÁÒ 1 Column
            End With
            
            With Sheets("AddData")
                Set Rng4 = .Range("E1:E" & TRow) '´Ö§ Column F ÁÒ 1 Column
            End With
            

            ColName = 2
            ColNameE = 3
            DateB = 4
            
                            
            lng = Application.CountIf(Rng.Resize(, 1), Target)
        
            If lng >= 1 Then
                Sheet11.Unprotect 1234
                If Target.Offset(0, 0) <> "" Then '¶éÒ Column äÁèà·èҡѺÇèÒ§ ãËé·Ó
                    lng1 = Application.CountIf(Rng1.Resize(, 1), Target)
                    If lng1 >= 1 Then ' µÃǨÊͺ¢éÍÁÙÅà´ÔÁÇèÒà¤Â¢ÍËÃ×Íà»ÅèÒ
                    
                    Range("L1").Formula = "=Lookup(2, 1 /(" & Rng2.Address & "=" & Target & ")," & Rng3.Address & ")"
                    FndVal = Range("L1").Value
                    Range("L1").Formula = "=Lookup(2, 1 /(" & Rng2.Address & "=" & Target & ")," & Rng4.Address & ")"
                    FndVal2 = Range("L1").Value
                    Range("L1").ClearContents
                    
                    
                        'MsgBox ("ÅÙ¡¤éÒà¤Â¢Í¢éÍÁÙÅàÁ×èÍÇѹ·Õè  " & Format(Application.VLookup(Target, Rng1, DateB, 0), "dd/mm/yyyy") & "  " & Application.VLookup(Target, Rng1, ColNameE, 0))
                        
                        MsgBox ("ÅÙ¡¤éÒà¤Â¢Í¢éÍÁÙÅàÁ×èÍÇѹ·Õè  " & WorksheetFunction.Text(FndVal, "dd/mm/yyyy") & "  " & FndVal2)
                        
                        Target.Offset(0, 2) = Application.VLookup(Target, Rng1, ColNameE, 0) 'àÍÒª×èÍÍѧ¡Äɢͧà¡èÒÁÒãÊè
                        Target.Offset(0, 3).Activate 'ä»·ÕèªèͧãÊèÇѹ·Õè¢éÍÁÙÅ·Õèµéͧ¡ÒÃ
                    End If
                    Target.Offset(0, 1) = Application.VLookup(Target, Rng, ColName, 0)
                    'Target.Offset(0, -1) = Now() 'Format(Now(), "dd/mm/yyyy") '¡Ó˹´ãËé Column B = Çѹ·Õè»Ñ¨¨ØºÑ¹
                    Target.Offset(0, -1) = Date
                    Target.Offset(0, -2) = Target.Offset(-1, -2) + 1 'ãËé Column A ÃѹàÅ¢ NO.
                    If Target.Offset(0, 2) = "" Then
                        Target.Offset(0, 2).Activate 'ãËéä»·Õè Column ¶Ñ´ä»
                    Else
                        Target.Offset(0, 3).Activate
                    End If
                Else
                    Target.Offset(0, -1) = ""
                    Target.Offset(0, -2) = ""
                    Target.Offset(0, 1) = ""
                    Target.Offset(0, 2) = ""
                    Target.Offset(0, 3) = ""
                    Target.Offset(0, 4) = ""
                    Target.Offset(0, 5) = ""
                    Target.Offset(0, 6) = ""
                    Target.Offset(0, 7) = ""
                    Target.Offset(0, 0).Activate
                End If
            Else
                '¶éÒäÁèÁÕã¹°Ò¹¢éÍÁÙÅ
                If Target.Offset(0, 0) <> "" Then
                    MsgBox ("àÅ¢·ÕèºÑ­ªÕ¹ÕéäÁèÁÕã¹°Ò¹¢éÍÁÙÅ")
                End If
                Sheet11.Unprotect 1234
                Target.Offset(0, -1) = ""
                Target.Offset(0, -2) = ""
                Target.Offset(0, 1) = ""
                Target.Offset(0, 2) = ""
                Target.Offset(0, 3) = ""
                Target.Offset(0, 4) = ""
                Target.Offset(0, 5) = ""
                Target.Offset(0, 6) = ""
                Target.Offset(0, 7) = ""
                Target.Offset(0, 0).Activate
                Sheet11.Protect 1234
            End If
        End If
        
        If Target.Column = 5 Then
            Target.Offset(0, 1).Activate
        End If
            
        If Target.Column = 6 Then
            Target.Offset(0, 1).Activate
        End If
            
        If Target.Column = 7 Then
            Target.Offset(0, 1).Activate
        End If
            
        If Target.Column = 8 Then
            Target.Offset(0, 1).Activate
        End If
            
        If Target.Column = 9 Then
            If Target.Offset(0, 0) <> "" Then
                If Target.Offset(0, 0) = 0 Then
                    Target.Offset(0, 1) = 0
                    Target.Offset(1, -6).Activate
                Else
                    Target.Offset(0, 1) = Target.Offset(0, -2) / Target.Offset(0, 0) 'Colume ·Õè7 à·èҡѺ Colume ·Õè 4 ËÒà Colume ·Õè6
                End If
            End If
        End If
    
        If Target.Column = 10 Then
            Target.Offset(1, -7).Activate
        End If
        
End Sub


Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Tue Sep 13, 2016 1:45 pm
by vichaim
ขอบคุณ Admin และคุณmenem มากครับที่ให้ความสนใจในการทดสอบ ผมได้นำ Code ของ Admin ไปทดสอบแล้วครับ ใช้ได้ผลดีครับ ส่วน Code ของคุณmenem เดี่ยวผมจะไปทดสอบดูครับ ขอบคุณทุกท่านที่ให้ความสนใจครับ ขอบคุณครับ

ปล. ถ้าไม่เป็นการรบกวน ผมอยากให้ Admin ช่วยอธิบาย Code ช่วงนี้หน่อยครับ ขอบคุณครับ

Code: Select all

             For i = Rng1.Columns(1).Rows.Count To 1 Step -1
             If Rng1.Columns(1).Cells(i) = Target Then
            	 a = Rng1.Columns(1).Cells(i).Offset(0, 3).Value
             	 Exit For
             End If

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Tue Sep 13, 2016 6:32 pm
by snasui
:D เป็นการ Loop ทุกค่าในคอลัมน์แรกของตัวแปร Rng1 โดยเป็นการ Loop จากตัวท้ายสุดไปตัวแรกครับ

Rng1.Columns(1).Rows.Count นับว่าคอลัมน์แรกของตัวแปร Rng1 มีกี่ตัว

For i = Rng1.Columns(1).Rows.Count To 1 Step -1 เป็นการ Loop จากตัวสุดท้ายไปยังตัวแรกสุด

a = Rng1.Columns(1).Cells(i).Offset(0, 3).Value กำหนดค่าให้กับตัวแปร a โดยให้ค่าเท่ากับค่าที่ถัดไปจากคอลัมน์แรก 3 คอลัมน์

Re: สอบถามเรื่อง Vlookup Record สุดท้ายครับ

Posted: Wed Sep 14, 2016 9:39 am
by vichaim
ขอบคุณ Admin มากครับ เทคนิคนี้จะได้นำไปใช้งานอื่นต่อได้ครับ ขอบคุณครับ