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

การโพสต์ 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

แนบไฟล์พร้อมแสดงตัวอย่างคำตอบที่ถูกต้องมาด้วยจะได้เข้าใจตรงกันว่ากำลังจะทำอะไร ที่ชีตใด เซลล์ใด อย่างไร เช่นนี้เป็นต้นครับ
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%

คำถามนี้ไม่เกียวกับกระทู้เดิม ให้ตั้งกระทู้ใหม่ครับ
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

คุณ vichaim ยังไม่ได้ทำตามที่ผมแจ้งไปตามด้านล่างครับ
snasui wrote: 
สำหรับการ 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

หากเป็นเช่นนั้นให้ลบ 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

เนื่องจาก 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

เป็นการ 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 มากครับ เทคนิคนี้จะได้นำไปใช้งานอื่นต่อได้ครับ ขอบคุณครับ