Page 1 of 2
ใช้ Vlookup ใน USER FORM
Posted: Mon Aug 25, 2014 3:42 pm
by titus2014
เรียน อาจารย์ที่เคารพ
พอดีผมติดปัญหาเกี่ยวกับการ ใช้ Vlookup ใน USER FORM
ใน USER FROM ให้ใส่รหัสกล่องสินค้า
ในช่อง TEXT BOX รายการให้โชว์สินค้าที่ใช้รหัสกล่องนั้น โดยไฟล์ข้อมูลหลักอยู่ที่ Sheet "DATA"
ผมสามารถเขียนอย่างไรได้บางครับ
ตอนนี้ผมเขียนออกมาเป็นแบบด้านล่าง
Private Sub txtlist_Change()
With Application.WorksheetFunction
txtlist.Value = .VLookup(Sheets("DATA").Range("NUM"), Sheets("DATA").Range("LIST"), 2, False)
End With
End Sub
แต่พอป้อนค่าเข้าไปมันไม่โชว์ครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Mon Aug 25, 2014 7:31 pm
by snasui

ที่เขียนมาเองแล้วนั้นติดปัญหาอะไรแจ้งมาด้วยครับ
สำหรับการโพสต์ Code ให้แสดงเป็น Code ดูตัวอย่างจากกระทู้นี้ เพื่อจะได้สะดวกในการอ่านและ Copy ไปทดสอบครับ
viewtopic.php?f=3&t=1187
Re: ใช้ Vlookup ใน USER FORM
Posted: Mon Aug 25, 2014 7:40 pm
by titus2014
ขออภัยครับ
Code: Select all
Private Sub txtlist_Change()
With Application.WorksheetFunction
txtlist.Value = .VLookup(Sheets("DATA").Range("NUM"), Sheets("DATA").Range("LIST"), 2, False)
End With
End Sub
แต่พอป้อนค่าเข้าไปที่ ช่อง txtcode ในช่อง txtlist ไม่โชว์ข้อมูลที่ต้องการครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Mon Aug 25, 2014 8:00 pm
by snasui

ค่อย ๆ ถามตอบกันไปนะครับ
ตัวอย่าง Code หากว่าผู้ใช้งานกรอกรหัสกล่องแล้วคลิกปุ่มบันทึก หากมีรหัสนั้นก็จะแสดงรายการมาที่ช่องรายการรหัสสินค้า
Code: Select all
Private Sub CommandButton1_Click()
With Application.WorksheetFunction
txtlist.Value = .VLookup(Val(txtcode.Text), Sheets("DATA").Range("A2:C11"), 2, False)
End With
End Sub
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 11:56 am
by titus2014
snasui wrote:
ค่อย ๆ ถามตอบกันไปนะครับ
ตัวอย่าง Code หากว่าผู้ใช้งานกรอกรหัสกล่องแล้วคลิกปุ่มบันทึก หากมีรหัสนั้นก็จะแสดงรายการมาที่ช่องรายการรหัสสินค้า
Code: Select all
Private Sub CommandButton1_Click()
With Application.WorksheetFunction
txtlist.Value = .VLookup(Val(txtcode.Text), Sheets("DATA").Range("A2:C11"), 2, False)
End With
End Sub
ทดลองแล้วไม่ขึ้นครับ สร้างปุ่มเพิ่มแล้วลองใส่โค๊ดนี้ ในช่อง รายการสินค้าไม่โชว์ตามที่กำหนดไว้ครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 12:00 pm
by snasui

ก่อนโพสต์ฺผมทดลองแล้วสามารถใช้ได้ตามที่ผมโพสต์ครับ
snasui wrote:หากว่าผู้ใช้งานกรอกรหัสกล่องแล้วคลิกปุ่มบันทึก หากมีรหัสนั้นก็จะแสดงรายการมาที่ช่องรายการรหัสสินค้า
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 12:29 pm
by titus2014
snasui wrote:
ก่อนโพสต์ฺผมทดลองแล้วสามารถใช้ได้ตามที่ผมโพสต์ครับ
snasui wrote:หากว่าผู้ใช้งานกรอกรหัสกล่องแล้วคลิกปุ่มบันทึก หากมีรหัสนั้นก็จะแสดงรายการมาที่ช่องรายการรหัสสินค้า
ขออภัยไม่ได้ลองให้ถี่ถ้วนครับ
ค่าที่จะแสดงก็ต่อเมื่อเรา กดปุ่มบันทึก
แต่ผมอยากให้แสดงค่าโดยไม่ต้องกดปุ่มใดๆเลยครับ
เหมือนเราใช้ Vlookup ปกติ แค่ป้อนค่าที่ช่อง รหัสกล่อง ก็แสดง
เพราะว่าปุ่มบันทึีก ผมจะส่งค่า ทั้งหมดใน form ไปเก็บไว้ใน Excel Sheet 1 อีกทีครับ
ผมลองดูตัวอย่างเก่าในบอร์ด
ลองใส่โค๊ดนี้
Code: Select all
Private Sub txtcode_Change()
Set myRange = Worksheets("DATA").Range("A2:C11")
txtlist.Value = Application.WorksheetFunction.VLookup(CLng(txtcode), myRange, 2, False)
End Sub
ได้ตามความต้องการครับ แต่ RUN TIME ERROR "13" ครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 1:20 pm
by snasui

คุณสามารถเพิ่มปุ่มสำหรับการตรวจสอบว่าค่าที่คี่ย์มีอยู่หรือไม่ หากมีก็ให้แสดงลงใน Oject ต่าง ๆ สำหรับปุ่มบันทึกเอาไว้บันทึกข้อมูล
การใช้ Vlookup
ในทุกการเปลียนแปลงใน TextBox แม้คีย์เพียงอักขระเดียวก็ตรวจสอบทันที หากต้องการเช่นนั้นก็ทำได้โดยการใช้ Change Event ตาม Code ที่ยกมาเป็นตัวอย่าง
หากต้องการไม่ให้เกิด Error ก็ควรใช้การดัก Error เข้าไปช่วย เช่นวาง Code
on error resume next เอาไว้ก่อน
Set myRange ครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 2:17 pm
by titus2014
snasui wrote:
คุณสามารถเพิ่มปุ่มสำหรับการตรวจสอบว่าค่าที่คี่ย์มีอยู่หรือไม่ หากมีก็ให้แสดงลงใน Oject ต่าง ๆ สำหรับปุ่มบันทึกเอาไว้บันทึกข้อมูล
การใช้ Vlookup
ในทุกการเปลียนแปลงใน TextBox แม้คีย์เพียงอักขระเดียวก็ตรวจสอบทันที หากต้องการเช่นนั้นก็ทำได้โดยการใช้ Change Event ตาม Code ที่ยกมาเป็นตัวอย่าง
หากต้องการไม่ให้เกิด Error ก็ควรใช้การดัก Error เข้าไปช่วย เช่นวาง Code
on error resume next เอาไว้ก่อน
Set myRange ครับ
ขอบคุณมากครับ
อยากจะสอบถามเกี่ยวกับ เกี่ยวกับการประกาศตัวแปร
Set myRange = Worksheets("DATA").Range("A2:C11")
1. ในการเขียน VBA เราต้องมาประกาศตัวแปรภายใน ด้วยหรอครับ
เราไม่สามารถใช้ Range Name ที่เราตั้งชื่อ ได้เลยใช่ไหมครับ
2.อยากให้อาจาร์ยอธิบายเกี่ยวกับ
Val(txtcode.Text) ความหมายของ Val หน่อยครับ
ขอบคุณมากครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 2:26 pm
by snasui
titus2014 wrote:อยากจะสอบถามเกี่ยวกับ เกี่ยวกับการประกาศตัวแปร
Set myRange = Worksheets("DATA").Range("A2:C11")
1. ในการเขียน VBA เราต้องมาประกาศตัวแปรภายใน ด้วยหรอครับ
เราจะประกาศตัวแปรหรือไม่ก็ได้ แต่การประกาศตัวแปรทำเพื่อจัดสรร Memory ให้ใช้อย่างเหมาะสม เพราะการไม่ประกาศตัวแปร โปรแกรมถือว่าตัวแปรนั้นเป็น Variant จะกิน Memory และหากใช้กับโปรแกรมขนาดใหญ่ที่เขียนอย่างซับซ้อนจะเกิด Memory ไม่พอใช้
titus2014 wrote:เราไม่สามารถใช้ Range Name ที่เราตั้งชื่อ ได้เลยใช่ไหมครับ
ไม่ใช่ครับ กรณีตั้งชื่อให้กับ Range Name แล้วเราสามารถอ้างเป็น
Range("myRange") หาก myRange หมายถึงชื่อทีเราตั้งไว้ล่วงหน้า
titus2014 wrote:Val(txtcode.Text) ความหมายของ Val หน่อยครับ
Val เป็นการแปลง String ที่มีตัวเลขอยู่ด้วยให้เป็นตัวเลข ค่าที่คีย์ลงใน Object เช่น TextBox, ComboBox จะเป็น String การจะนำมาใช้คำนวณต่อปกติแล้วต้องแปลงให้เป็นตัวเลขเสียก่อน ซึ่ง Val ก็เป็นทางเลือกหนึ่งที่มักจะนำมาใช้ครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 3:00 pm
by titus2014
snasui wrote:titus2014 wrote:อยากจะสอบถามเกี่ยวกับ เกี่ยวกับการประกาศตัวแปร
Set myRange = Worksheets("DATA").Range("A2:C11")
1. ในการเขียน VBA เราต้องมาประกาศตัวแปรภายใน ด้วยหรอครับ
เราจะประกาศตัวแปรหรือไม่ก็ได้ แต่การประกาศตัวแปรทำเพื่อจัดส Memory ให้ใช้อย่างเหมาะสม เพราะการไม่ประกาศตัวแปร โปรแกรมถือว่าตัวแปรนั้นเป็น Variant จะกิน Memory และหากใช้กับโปรแกรมขนาดใหญ่ที่เขียนอย่างซับซ้อนจะเกิด Memory ไม่พอใช้
titus2014 wrote:เราไม่สามารถใช้ Range Name ที่เราตั้งชื่อ ได้เลยใช่ไหมครับ
ไม่ใช่ครับ กรณีตั้งชื่อให้กับ Range Name แล้วเราสามารถอ้างเป็น
Range("myRange") หาก myRange หมายถึงชื่อทีเราตั้งไว้ล่วงหน้า
titus2014 wrote:Val(txtcode.Text) ความหมายของ Val หน่อยครับ
Val เป็นการแปลง String ที่มีตัวเลขอยู่ด้วยให้เป็นตัวเลข ค่าที่คีย์ลงใน Object เช่น TextBox, ComboBox จะเป็น String การจะนำมาใช้คำนวณต่อปกติแล้วต้องแปลงให้เป็นตัวเลขเสียก่อน ซึ่ง Val ก็เป็นทางเลือกหนึ่งที่มักจะนำมาใช้ครับ
กระจ่างเลยครับ ดำน้ำอยู่นาน ขอบคุณครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 3:33 pm
by titus2014
อันนี้ขอต่อยอดหน่อยครับ
ถ้าเราต้องการสร้างเงื่อนไขสำหรับ Vlookup
โดยเงื่อนไข เรามี แค่ 3 ค่า
คือ 1-3
ผมเลือกใช้ Case ครับ
Case ที่ 1 ถ้า ในช่องtxtp มีค่า = 1 ให้ไปดูที่ แถวที่ 1 ของ Allitem
Case ที่ 2 ถ้า ในช่องtxtp มีค่า = 2 ให้ไปดูที่ แถวที่ 2 ของ Allitem
Case ที่ 2 ถ้า ในช่องtxtp มีค่า = 3 ให้ไปดูที่ แถวที่ 3 ของ Allitem
ผมเขียนยังนี้ หรือมีวิธีเขียนที่สั่นกว่านี้ครับ
Code: Select all
Private Sub txtcode_Change()
On Error Resume Next
Select Case txtp.Value
Case txtp.Value = "1"
With Application.WorksheetFunction
txtlist.Value = .VLookup(Val(txtp.Text), Sheets("DATA").Range("allitem"), 1, False)
Case txtp.Value = "2"
With Application.WorksheetFunction
txtlist.Value = .VLookup(Val(txtp.Text), Sheets("DATA").Range("allitem"), 2, False)
Case txtp.Value = "3"
With Application.WorksheetFunction
txtlist.Value = .VLookup(Val(txtp.Text), Sheets("DATA").Range("allitem"), 3, False)
End With
End Sub
ขอบคุณครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 3:43 pm
by snasui

ตัวอย่าง Code ตามด้านล่างครับ
Code: Select all
txtlist.Value = .VLookup(Val(txtp.Text), Sheets("DATA").Range("allitem"), Val(txtp.Value), False)
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 5:02 pm
by titus2014
snasui wrote:
ตัวอย่าง Code ตามด้านล่างครับ
Code: Select all
txtlist.Value = .VLookup(Val(txtp.Text), Sheets("DATA").Range("allitem"), Val(txtp.Value), False)
ขอบคุณครับอาจาร์ย
ทำไปทำมา ลืมไปว่า Vlookup แสดงแค่รายการเดียว
ผมต้องการสร้างเงือนไข มากกว่า 2 รายการ
if txtp = 1 ให้ Combo Box แสดง List จากชื่อ item1
if txtp = 2 ให้ Combo Box แสดง List จากชื่อ item2
if txtp = 3 ให้ Combo Box แสดง List จากชื่อ item3
Combo Box ต้องเขียนอย่างไรครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 5:26 pm
by snasui

สามารถใช้ RowSource มาช่วยได้ ลองดูตัวอย่างที่กระทู้นี้ครับ
viewtopic.php?t=3450&p=23511 สำหรับตัวอย่างอื่น ๆ ดูที่นี่ครับ
RowSource
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 5:54 pm
by titus2014
ขอบคุณมากครับ อาจาร์ย
ตอนแรกผมก็ใส่ RowSource =RangName ดูเหมือนรายการมันจะเยอะไปหน่อยครับ
ถามอาจาร์ยหน่อยครับ รูปแบบการเขียน RowSource ใน VBA หรือคำสั่งอืนๆ เราจะศึกษาจากไหน ครับ
และ .Value .Address อื่นๆ พวกนามสกลุ พวกนี้ เราจะเลือกใช้อย่างไรให้ถูกต้อง
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 6:05 pm
by snasui

การจะใช้ให้ถูกต้องคงต้อง
ซื้อหนังสือมาศึกษาอย่างจริงจัง สำหรับแหล่งข้อมูลสำคัญที่ควรใช้ให้เป็นคือ Help ของโปรแกรมครับ จะได้ทราบว่า Property หรือ Method แต่ละตัวมีความหมายและให้ผลลัพธ์เป็นอะไร ทราบแต่เพียงอย่างเดียวคงไม่พอ ต้องฝึกฝนอย่างมากหากต้องการใช้อย่างคล่องแคล่ว
สำหรับ
.Valueจะเป็น Default Property ของ Range เช่นนี้เป็นต้น ส่วน
.Textก็เป็นค่า Default ของ Object ต่าง ๆ เช่น TextBox, ComboBox ครับ
คำว่า Default หมายถึงค่าตั้งต้น หากเราไม่ใส่ โปรแกรมจะใช้ค่าตั้งต้น ยกตัวอย่าง หากเราคีย์เป็น Range("A1") โปรแกรมจะถือว่าเราเขียนเป็น Range("A1").Value
โดยปกติ การเขียนโปรแกรมที่ดีจะต้องเขียน Property เข้าไปกำกับเสมอ แม้มันจะเป็นที่ทราบกันว่าใช้ค่าตั้งต้นก็ตาม เพื่อให้โปรแกรมเมอร์ที่มาทำงานต่ออ่านเข้าใจได้ทันที
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 6:38 pm
by titus2014
Code: Select all
Private Sub UserForm_Initialize()
Add.Visible = False
a = Range("item1")
b = Range("item2")
c = Range("item3")
Select Case txtp.Value
Case txtp.Value = 1
txtlist.RowSource = a
Case txtp.Value = 2
txtlist.RowSource = b
Case txtp.Value = 3
txtlist.RowSource = a
End Select
End Sub
ผิดตรงครับอาจาร์ย ERROR RUN TIME "424" Object required
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 7:11 pm
by titus2014
snasui wrote:
การจะใช้ให้ถูกต้องคงต้อง
ซื้อหนังสือมาศึกษาอย่างจริงจัง สำหรับแหล่งข้อมูลสำคัญที่ควรใช้ให้เป็นคือ Help ของโปรแกรมครับ จะได้ทราบว่า Property หรือ Method แต่ละตัวมีความหมายและให้ผลลัพธ์เป็นอะไร ทราบแต่เพียงอย่างเดียวคงไม่พอ ต้องฝึกฝนอย่างมากหากต้องการใช้อย่างคล่องแคล่ว
สำหรับ
.Valueจะเป็น Default Property ของ Range เช่นนี้เป็นต้น ส่วน
.Textก็เป็นค่า Default ของ Object ต่าง ๆ เช่น TextBox, ComboBox ครับ
คำว่า Default หมายถึงค่าตั้งต้น หากเราไม่ใส่ โปรแกรมจะใช้ค่าตั้งต้น ยกตัวอย่าง หากเราคีย์เป็น Range("A1") โปรแกรมจะถือว่าเราเขียนเป็น Range("A1").Value
โดยปกติ การเขียนโปรแกรมที่ดีจะต้องเขียน Property เข้าไปกำกับเสมอ แม้มันจะเป็นที่ทราบกันว่าใช้ค่าตั้งต้นก็ตาม เพื่อให้โปรแกรมเมอร์ที่มาทำงานต่ออ่านเข้าใจได้ทันที
เปิดเข้ามาดู HELP

แหล่งความรู้เต็มๆ แต่ต้องนั้งทำความเข้าใจศัพท์มากมายเลยครับ
Re: ใช้ Vlookup ใน USER FORM
Posted: Tue Aug 26, 2014 9:52 pm
by snasui

แนบไฟล์ที่ได้ Update Code แล้วมาด้วย จะได้ดูต่อไปจากนั้นครับ