Page 1 of 1

Application.WorksheetFunction.VLookup

Posted: Mon Jun 13, 2011 1:00 pm
by Bafnet
สวัสดีครับอาจารย์ มีเรื่องรบกวนอีกแล้วครับ ผมซื้อหนังสือของอ.วิศัลย์ พัวรุ่งโรจน์
ก็ทำตามหนังสือบอกทุกอย่าง ตามไฟล์แนบ แต่มันDebug
ผมไม่เข้าใจ...คล้ายๆกับว่าApplication.WorksheetFunction.VLookup ยังไม่พร้อมใช้งาน
รบกวนอาจารย์หรือพี่ผู้รู้อธิบายหน่อยนะครับว่าเป็นเพราะอะไร และหากต้องการใช้Application.WorksheetFunction.VLookupนี้ให้ได้ต้องทำอย่างไร
ขอเป็นคำอธิบายแบบกระจ่างเลยนะครับ เอาแบบเป็นขั้นตอนเลยนะครับ :lol: ผมพื้นฐานน้อย
ขอบพระคุณครับ

Re: Application.WorksheetFunction.VLookup

Posted: Mon Jun 13, 2011 6:44 pm
by snasui
จาก Code ในไฟล์ไม่ถูกต้องอยู่หลายตำแหน่ง ดูภาพประกอบด้านล่าง กรณีลอกจากหนังสือมาแบบเหมือนเปี๊ยบควรบอกคุณวิศัลย์ให้ทดสอบ Code อีกครั้งครับ 8-)

1. SetmyRange ต้องแยกเป็น Set myRange (มีวรรค)
2. .Range("B2:E12") ให้แก้เป็น .Range("A3:B12")
3. Cbocode หรือ Cbocode.Value จะแสดงค่าเป็น String (Text) ส่วนใน Worksheet มีค่าเป็น Number จึงต้องใช้ Function Clng() เข้ามาช่วย
4. หากตัวเลขในช่วง A3:A12 ไม่เรียงจากน้อยไปหามากให้ใส่ False ไว้ด้วยครับ

Re: Application.WorksheetFunction.VLookup

Posted: Mon Jun 13, 2011 7:54 pm
by Bafnet
ขอบคุณมากๆครับ มันเป็นความอ่อนด้อยของผมเอง เมื่อมาพิจารณาดูจากที่อาจารย์อธิบายแล้วก็พบว่าในตัวอย่างของหนังสือนั้น
ใช้รหัสสินค้าเป็น B2001,B2002 ซึ่งมีค่าเป็นText ส่วนเลขทะเบียนลูกค้าผมเป็น 001,002...
ชักจะท้อแล้วครับ

Re: Application.WorksheetFunction.VLookup

Posted: Mon Jun 13, 2011 8:05 pm
by snasui
อย่าเพิ่งท้อครับ การเขียน Code ต้องอาศัยเขียนบ่อย ๆ และเท่าที่เห็นไฟล์ตัวอย่างที่ผ่าน ๆ มา มีการบันทึก Macro มาดูตัวอย่าง Code ผมถือว่ามาถูกทางแล้ว ขอเป็นกำลังใจให้ครับ

Re: Application.WorksheetFunction.VLookup

Posted: Thu Jun 16, 2011 6:58 pm
by Bafnet
สวัสดีครับอาจารย์ วันนี้มีปัญหามารบกวนอีกแล้วครับ
เรื่อง
1.การรับค่าที่เป็นวันที่ของTextBox ครับ ตอนนี้มันส่งค่าออกมาเป็นข้อความครับ
2.TextBox ระหว่างฟอร์ม
3.การส่งค่าไปบันทึก แก้ไข หรือลบค่าที่เลือกทิ้งไป
4.การกำหนดรูปแบบ TextBox
ผมรบกวนอาจารย์ทำให้ดูเป็นตัวอย่างหน่อยนะครับ
คราวที่แล้วอาจารย์ให้วิธีเขียน Target มา ผมไม่ทราบว่าจะนำไปใช้อย่างไร ต้องนำไปสร้างเป็น ชื่อสูตร หรือเขียนในวีบี ทำไม่เป็นจริงๆครับ
ผมหวังว่าอาจารย์คงไม่รำคาญผมนะครับ ขอบคุณมากครับ

Re: Application.WorksheetFunction.VLookup

Posted: Thu Jun 16, 2011 11:01 pm
by snasui
Bafnet wrote:1. จากฟอร์ม มีวิธีการส่งข้อมูล และ แก้ไขไปบันทึกลักษณะนี้ คราวที่แล้วอาจารย์ให้การเขียนTarget มาแต่ผมไม่ทราบว่านำไปใช้ยังไง
วิธีที่ผมใช้มีปัญหาตรงที่เราไม่สามารถแก้ไขส่วนที่เป็นค่า key แก้ไขได้แต่รายละเอียด เช่นจะแก้จากรหัส 2 เป็น 3 ไม่ได้ ผมอยากให้อิสระ จาก 2 นางสม สวยดีมาก เป็น 3 นายมะนะ ใจดี
โดยส่งค่ากลับไปแทนแถวของ 2 นางสม สวยดีมาก ไม่ทราบจะอธิบายอย่างไรดีงงกับตัวเองครับแต่อาจารย์คงเข้าใจ
ผมมีตารางข้อมูลจำนวนมาก ต้องนั่งสร้าง Key ,Ref , Id ,Targetบันทึก ,TarGetแก้ไข,Source หนึ่งตารางผมต้องสร้าง 5 ตัว พอทำไป6-7 ตารางเริ่มหลงกับชื่อที่ตั้งมา
รบกวนอาจารย์ทำตัวอย่างให้ดูจากฟอร์มในการส่งข้อมูล และการแก้ไขข้อมูลที่ต้องการ
สงสัยครับว่าทำไมต้องสร้าง Userform มารับค่าจากเซลล์แล้วส่งกลับค่ากลับไปแก้ไขเซลล์ เพื่อความสะดวกแล้วจะไม่ส่งค่ากลับไปกลับมาลักษณะเช่นนี้ครับ ทำฟอร์มในเซลล์แล้วก็ Update ได้เลย การทำฟอร์มขึ้นมารับค่าจะเสียเวลาไปเป็นอันมากในการสร้าง Object ให้ชื่อ Object เขียนตัวแปร เขียน Code ฯลฯ :)
Bafnet wrote:2. เรื่องของTextBox ที่รับวันที่ ซึ่งผมตั้งใจอยากให้ผู้ใช้คีย์ 00/00/0000 เป็นวันเดือนปีไทย ปกติบนแผ่นงานผมกำหนดรูปแบบเป็น dd/mm/bbbb
ผมต้องการให้ TextBox_AfterUpdate() ฟอร์แมทข้อมูลที่คีย์เข้าไปเป็นรูปแบบวันที่ในลักษณะ วันเดือนปี ของไทยเราครับ ไม่ทราบว่าต้องเขียนอย่างไร
เพราะตอนนี้ TextBox ส่งค่าออกมาเป็นข้อความ

3. เรื่อง TextBox อีกครับจะต้องเขียนอย่างไร ให้ได้รูปแบบตามที่ต้องการ เช่น เบอร์โทรศัพท์ ตอนคีย์ 0841234567
แต่อยากให้แสดงผลเป็น 084-1234-567 ประมาณนี้ หรือคีย์เลข 1 แล้วแสดงค่าเป็น 001
TextBox1_AfterUpdate()
TextBox1.Value = format(…….ไม่เป็นครับ

4. เรื่องของ TextBoxt อีกครับ
เราจะเขียนอย่างไรครับถ้าต้องให้ TextBox1 ที่อยู่บนฟอร์มอีกตัวหนึ่ง มีค่าเท่ากับ TexTbox1 ที่อยู่บนฟอร์มอื่น

5. เรื่องสุดท้ายในวันนี้ครับ (ยังคงต้องรบกวนอีกมากมายครับ)
ในฟอร์ม ผมกำหนด Cmd ลบข้อมูล อาจารย์เขียนให้ดูหน่อยนะครับว่าต้องการลบข้อมูลที่เลือกออกจากตารางไปเลยทำอย่างไรครับ

ขอบคุณครับ
เกือบลืมครับใน Toolbox มีเครื่องมือ Carlenda เรากำหนดมันให้เป็นเดือน ปี ของไทยเราได้ไหมครับ เพราะมันเป็นปี ค.ศ
หรืออาจารย์จะแนะนำอย่างไรถ้าเราอยากให้ผู้ใช้สามารถเลือกวันที่ไทยเราจากปฏิทินได้
ตอบแบบรวม ๆ นะครับ เนื่องจากวันเดือนปี ไม่ควรมีค่าเป็นปีพ.ศ. ควรจะคีย์เป็นปีค.ศ. เพื่อความสะดวกในการใช้งาน เนื่องจาก Excel จะรู้จักวันเดือนปีเป็นค.ศ.เท่านั้นครับ การจะให้แสดงผลเป็นพ.ศ. ให้ใช้การจัดรูปแบบ

การจัดรูปแบบในเซลล์ ให้คลิกเลือกเซลล์ กดแป้น Ctrl+1 > เลือก Custom > ช่อง Type คีย์ dd/mm/bbbb

ส่วนการจัดรูปแบบเบอร์โทรให้เป็น xxx-xxxx-xxx ก็คีย์ในช่อง Type เป็น 000-0000-000 ครับ

สำหรับการเลือกวันที่จากปฏิทินลองค้นหาจากฟอรัมนี้ครับผมตอบไว้พอสมควร และงานนี้ดูแล้วไม่ต้องใช้ UserForm จึงเห็นว่าไม่ควรไปเปลืองเวลากับการจัดการ TextBox ครับ กรณีที่ต้องการ Update ค่าข้อมูลหรือแก้ไขข้อมูลเดิมและผมเขียน Code ให้แล้วยังไม่เข้าใจตรงไหน ช่วยยก Code เดิมและแจ้งปัญหามาด้วยจะได้ช่วยดูต่อครับ

Re: Application.WorksheetFunction.VLookup

Posted: Fri Jun 17, 2011 12:39 am
by Bafnet
สวัสดีครับอาจารย์ ต้องขออภัยด้วยครับกับสิ่งที่ผมถาม
ประเด็นที่ผมใช้ UserForm รับค่า โดยไม่สร้างฟอร์มในเซล อาจเป็นเพราะความสงสัยที่ผมได้เห็นโปรแกรมสำเร็จที่มีฟอร์มสวยงาม มีปุ่มบันทึก แก้ไข หรือเพิ่มข้อมูลได้ ก็เลยอยากเรียนรู้วิธีที่เขาสร้างกัน
แต่ผมไม่มีพื้นฐาน และไม่อาจที่จะเริ่มต้นกับ Visual Basic แต่เห็นว่าเอ็กเซลสามารถเขียนคำสั่งในลักษณะนั้นได้ก็ขอเริ่มหัดกับเอกเซล
การส่งค่ากลับไปมาเพื่อแก้ไขหรือบันทึกที่ผมทำ เพราะผมรู้วิธีนี้อย่างเดียว คราวแรกที่เขาบอกให้สร้าง FormulaName ที่ชื่อTarget ก็พยายามอยู่เป็นเดือนกว่าจะหาวิธีสร้างเจอ
สำหรับ Code ที่อาจารย์ให้มา
Dim Target As Range
Set Target = Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
ผมพอจะเข้าใจว่า เป้าหมายคือส่งข้อมูลไปต่อแถวทีละแถว แต่ก็นั่งงงว่าแล้วจะเขียนต่ออย่างไร มันรู้ได้ยังไงว่าข้อมูลไหนที่เราจะให้ส่งไป แล้วเวลาแก้ไขข้อมูลหรือลบจะเขียนต่อจากที่อาจารย์ให้มายังไงจึงจะทำให้มัน
ส่งค่ากลับไปแก้ไขข้อมูลลูกค้าที่เราต้องการซึ่งมีมากกว่า 5000 รายการ โดยสรุปแล้วนั่งงครับ แต่ก็จะพยายามลองทำครับ
เรื่องTextBox ที่ผมเรียนถามอาจารย์ก็เพราะว่าเมื่อผมส่งค่าในTextBox ไปยังเซลที่ผมกำหนด Sheet1.Range("A1").Value = TextBox1.Value '(ซึ่งเป็นค่าวันที่ 16/04/2006)
ไม่ว่าผมจะพยายามกำหนดรูปแบบเซล A1 เป็นรูปแบบวันที่ชนิดไหน หรือเลือกกำหนดรูปแบบเอง(Custom) ค่าในเซลก็ไม่ยอมเปลี่ยน
ส่วนเรื่องตัวเลขที่คีย์ 0841234567 แล้วให้แสดงเป็น 084-1234-567 ซึ่งในเซลเราสามารถกำหนดรูปแบบได้เอง 000-0000-000 มันก็เป็นเพียงข้อสงสัยว่าแล้วในTextBoxล่ะ เขากำหนดยังไงเพื่อให้แสดงค่าแบบนี้
ครับก็คงเรียนชี้แจงอาจารย์เพียงเท่านี้ ผมอาจจะอยากทำนั้นทำนี่มากไปหน่อย ซึ่งอาจทำให้อาจารย์ไม่สะดวกใจ หรือระอาใจ ก็ต้องขออภัยอาจารย์ด้วยนะครับ ในความอยากรู้แต่ไม่มีความรู้ของผม
จะพยายามต่อไปครับ ขอบคุณอาจารย์มากๆครับ

Re: Application.WorksheetFunction.VLookup

Posted: Fri Jun 17, 2011 7:24 am
by snasui
Bafnet wrote:สวัสดีครับอาจารย์ ต้องขออภัยด้วยครับกับสิ่งที่ผมถาม
ประเด็นที่ผมใช้ UserForm รับค่า โดยไม่สร้างฟอร์มในเซล อาจเป็นเพราะความสงสัยที่ผมได้เห็นโปรแกรมสำเร็จที่มีฟอร์มสวยงาม มีปุ่มบันทึก แก้ไข หรือเพิ่มข้อมูลได้ ก็เลยอยากเรียนรู้วิธีที่เขาสร้างกัน
แต่ผมไม่มีพื้นฐาน และไม่อาจที่จะเริ่มต้นกับ Visual Basic แต่เห็นว่าเอ็กเซลสามารถเขียนคำสั่งในลักษณะนั้นได้ก็ขอเริ่มหัดกับเอกเซล
การส่งค่ากลับไปมาเพื่อแก้ไขหรือบันทึกที่ผมทำ เพราะผมรู้วิธีนี้อย่างเดียว คราวแรกที่เขาบอกให้สร้าง FormulaName ที่ชื่อTarget ก็พยายามอยู่เป็นเดือนกว่าจะหาวิธีสร้างเจอ
ผมทำตัวอย่างมาให้โดยไม่ต้องสร้าง UserForm ขึ้นมารับค่า โดยหากต้องการหาว่ามีข้อมูลอยู่หรือไม่ก็ให้คลิกปุ่ม Find Record, เมื่อต้องการสร้างรายการใหม่ให้คลิกปุ่ม Add Record และเมื่อต้องการแก้ไขข้อมูลเดิม ให้คลิก Update Record ตาม Code ด้านล่าง ดูไฟล์แนบประกอบครับ

Code: Select all

Sub FindRecords()
Dim lng As Long, rs As Range, rt As Range
With Worksheets("Sheet1")
On Error Resume Next
    lng = Application.Match(.Range("F4"), .Range("A:A"), 0)
    Set rs = .Range("A" & lng).Resize(, 4)
    Set rt = .Range("F4")
End With
    If Err > 0 Then
        MsgBox "Not found"
        Exit Sub
    Else
        rs.Copy: rt.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
End Sub

Sub AddRecords()
Dim rs As Range, rt As Range
With Worksheets("Sheet1")
    Set rs = .Range("F4:I4")
    Set rt = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
End With
    rs.Copy: rt.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

Sub UpdateRecords()
Dim lng As Long, rs As Range, rt As Range
With Worksheets("Sheet1")
On Error Resume Next
    lng = Application.Match(.Range("F4"), .Range("A:A"), 0)
    Set rt = .Range("A" & lng)
    Set rs = .Range("F4:I4")
End With
    If Err > 0 Then
        MsgBox "Not found"
        Exit Sub
    Else
        rs.Copy: rt.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
End Sub
Bafnet wrote:เรื่องTextBox ที่ผมเรียนถามอาจารย์ก็เพราะว่าเมื่อผมส่งค่าในTextBox ไปยังเซลที่ผมกำหนด Sheet1.Range("A1").Value = TextBox1.Value '(ซึ่งเป็นค่าวันที่ 16/04/2006)
ไม่ว่าผมจะพยายามกำหนดรูปแบบเซล A1 เป็นรูปแบบวันที่ชนิดไหน หรือเลือกกำหนดรูปแบบเอง(Custom) ค่าในเซลก็ไม่ยอมเปลี่ยน
ส่วนเรื่องตัวเลขที่คีย์ 0841234567 แล้วให้แสดงเป็น 084-1234-567 ซึ่งในเซลเราสามารถกำหนดรูปแบบได้เอง 000-0000-000 มันก็เป็นเพียงข้อสงสัยว่าแล้วในTextBoxล่ะ เขากำหนดยังไงเพื่อให้แสดงค่าแบบนี้
ไว้มีเวลาแล้วจะตรวจสอบ Code ที่เขียนมาว่าได้กำหนด TextBox ไว้อย่างไร แสดงผลอย่างไรและจะปรับอย่างไรครับ
Bafnet wrote:ครับก็คงเรียนชี้แจงอาจารย์เพียงเท่านี้ ผมอาจจะอยากทำนั้นทำนี่มากไปหน่อย ซึ่งอาจทำให้อาจารย์ไม่สะดวกใจ หรือระอาใจ ก็ต้องขออภัยอาจารย์ด้วยนะครับ ในความอยากรู้แต่ไม่มีความรู้ของผม
จะพยายามต่อไปครับ ขอบคุณอาจารย์มากๆครับ
ยินดีครับ ถามได้เต็มที่ไม่ต้องเป็นกังวลครับ ฟอรั่มนี้สร้างมาเพื่อถามตอบปัญหากัน คุณ Bafnet สงสัยก็ถามมา ผมสงสัยก็ถามกลับไป เพื่อความกระจ่างและหากมีหนทางที่สะดวกกว่าหรือมีทางเลือกอื่นก็จะได้แนะนำกัน เพื่อให้เป็นประโยชน์กับผู้ถามผู้ตอบและผู้ติดตามอ่านทุกท่านครับ :P

Re: Application.WorksheetFunction.VLookup

Posted: Fri Jun 17, 2011 3:09 pm
by snasui
:D กรณีกำหนดให้แสดง TextBox เป็นปีพ.ศ. และกำหนดให้แสดงขีดคั่นสำหรับเบอร์โทรศัพท์ลองตามด้านล่างครับ

Code: Select all

Private Sub ComboBox1_Change()
On Error Resume Next
Set myRange = Worksheets("Sheet1").Range("A2:D30")
    TextBox5.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 1, False)
    TextBox2.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 2, False)
    TextBox3.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 3, False)
    TextBox3 = Application.Text(TextBox3, "dd/mm/bbbb") 'ตัวเลขในเซลล์ควรเก็บเป็นค.ศ.
    TextBox4.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 4, False)
    TextBox4 = Format(TextBox4, "000-0000-000")
    'Range("C8") = DateValue(TextBox3) 'ตัวอย่างการนำค่าใน TextBox3 ไปวางกลับในเซลล์ C8 ให้เป็นค.ศ.เหมือนเดิม
If Err <> 0 Then
    MsgBox "ไม่มีรายการที่ท่านเลือก", vbQuestion
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = ""
    TextBox5.Text = ""
    Exit Sub
End If
End Sub

Re: Application.WorksheetFunction.VLookup

Posted: Mon Jun 20, 2011 1:29 am
by Bafnet
สวัสดีครับอาจารย์
ผมขอขอบคุณในความกรุณาของอาจารย์มากๆครับ
คำสอนของอาจารย์เป็นประโยชน์มากครับ ทำให้เห็นว่าในโครงสร้างของวีบีนั้นเป็นอย่างไร
เริ่มเข้าใจการกำหนดค่า การตั้งชื่อ เราสั่งให้มันทำอะไรก็ได้ถ้ารู้จักกำหนดค่าตัวแปร แต่ที่มีประโยชน์มากที่สุดคือเรื่อง On Error Resume Next
ขอบคุณมากครับที่ทำให้รู้ว่า ค่าที่เป็นข้อความ กับตัวเลขนั้นต่างกันอย่างไรในการให้ Exell คำนวณ
สนุกมากครับ

Re: Application.WorksheetFunction.VLookup

Posted: Sat Jun 25, 2011 11:52 pm
by Bafnet
สวัสดีครับอาจารย์ รบกวนดูให้ผมหน่อยนะครับ
ผมส่งข้อมูลไปเก็บไว้ที่อีกWorkbook หนึ่ง ก็ส่งค่าไปได้ครับ แต่อยากเพิ่มเติมคือไม่ให้บันทึกรายที่เคยบันทึกหรือมีข้อมูลอยู่แล้ว
เลยสร้าง Key =IF(COUNTIF(A:A,AA1)>=0,"Active","In Active")
ใช้เวลาหนึ่งวันเต็มๆ พอทำได้ก็รีบมาขอให้อาจารย์ดูหน่อย ว่าเขียนถูกมั๊ย มันอาจใช้งานได้แต่วิธีเขียนผมดูวุ่นวายจังครับ

Code: Select all

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
Dim wb As Variant
Dim rt As Range
Dim rs As Range
Dim myData As Range
Dim key As Object 'Dim key As Range กรณีที่แรงเนมที่เราอ้างถึงมีสูตรอยู่ควรประกาศตัวแปรเป็นอะไรครับ
Sheet1.Range("A3:Z3").Value = Sheet1.Range("A2:Z2").Value
If txtnum.Value = "" Then
MsgBox "กดผมทำไม เจ็บนะ", vbQuestion, "BES 4U"
TextBox1.Value = ""
Exit Sub
End If
Set wb = Workbooks.Open("C:\Program Files\BES 4U\DATA\base\data.xls", False, False)
ActiveWorkbook.Worksheets("tblcustom").Select
With Workbooks("data.xls").Worksheets("tblcustom")
Set rs = Workbooks("data.xls").Worksheets("tblcustom").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
Set myData = Workbooks("data.xls").Worksheets("tblcustom").Range("A:Z")
Set key = Workbooks("data.xls").Worksheets("tblcustom").Range("AB1") 'เดิมทีเขียน Set key =Workbooks("data.xls").Worksheets("tblcustom").Range("AB1")CountIf(.Range("A:A"), .Range("AB1"))
End With
With Workbooks("BES 4U.xls").Worksheets("master")
Set rt = Workbooks("BES 4U.xls").Worksheets("master").Range("A3:Z3")
End With
On Error Resume Next
If key = "Active" Then 'เดิม If Key = "Active" then (ผมกำหนดค่าที่AB2=IF(COUNTIF(A:A,AB1)>=1,"Active","In Active")
wb.Close True
Application.ScreenUpdating = False
MsgBox "มีข้อมูลบุคคลท่านนี้แล้วครับ", vbOKOnly, "BES 4U"
Else
rt.Copy: rs.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    
  Workbooks("data.xls").Worksheets("tblcustom").Activate
     myData.Select
    Selection.Sort Key1:=myData, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
   wb.Close True
MsgBox "บันทึกสำเร็จครับ", vbOKOnly, "BES 4U"
Application.ScreenUpdating = True
End If
If Err > 0 Then
Exit Sub
End If

End Sub
ชอบคุณครับ

Re: Application.WorksheetFunction.VLookup

Posted: Sun Jun 26, 2011 12:47 am
by Bafnet
อาจารย์ครับต้องขออภัยด้วย ที่คำลงท้ายผมตกหล่น ขอบคุณครับ แต่ที่พิมพ์กลับเป็นชอบคุณครับ
มีเรื่องเรียนถามอีกสักนิดนะครับ เรื่องของListbox
เราสามารถกำหนดให้ListBox แสดงข้อมูลของข้อมูลที่อยู่คนละWorkbookได้ไหมครับ
ตรงที่ช่องกำหนดค่าRowsource เรากำหนดได้ในลักษณะที่กล่าวมาได้หรือไม่ครับ
รบกวนแนะนำหน่อยนะครับ
ขอบคุณครับ

Re: Application.WorksheetFunction.VLookup

Posted: Sun Jun 26, 2011 6:45 am
by snasui
:D หากว่าใช้งานได้ก็ไม่มีปัญหาใดครับ ค่อย ๆ ปรับไปไม่ต้องรีบครับ ยกเว้นหากทำงานไม่ได้หรือช้ามาก็ค่อยมาทบทวนว่า Code ใดสร้างปัญหา สำหรับการอ้างถึงเซลล์ไม่ว่าเซลล์นั้นจะมีอะไรอยู่ข้างในก็ประกาศเป็น Range ได้ครับ

สำหรับการอ้างอิง RowSource โดยอ้างจาก Book อื่นๆ ดูตัวอย่างด้านล่างครับ

Code: Select all

Private Sub UserForm_Initialize()
    ListBox1.RowSource = "'[Book1.xlsx]Sheet1'!A2:A13"
End Sub
เป็นการนำช่วงข้อมูลของไฟล์ที่ชื่อ Book1.xlsx ชีทชื่อ Sheet1 ช่วงเซลล์ A2:A13 มาใช้ใน ListBox

Re: Application.WorksheetFunction.VLookup

Posted: Sun Jun 26, 2011 9:43 pm
by Bafnet
สวัสดีครับอาจารย์
รบกวนอีกแล้วครับ
จากการกำหนดค่าข้ามเวิร์กบุค มันมีปัญหาคือ ถ้าเวิร์กบุคที่เราอ้างถึงเราไม่ได้เปิดใช้งานก็เกิดdebug คือเวิร์กบุคที่ผมอ้างถึงเป็นที่ที่ผมส่งข้อมูลที่บันทึกไปเก็บไว้ ไม่ต้องการเปิด
แต่อยากให้แค่ดึงข้อมูลมาใช้ (ซึ่งได้ใช้ในสิ่งที่อาจารย์สอนที่ผ่านมา ในการบันทึก ค้นหา แก้ไขข้อมูลที่เก็บข้ามเวิร์กบุคได้แล้วครับ)
ListBox1.RowSource = "'[data.xls]tblcustom'!A:D" มันแสดงค่าในบรรทัดนี้ว่าListBox1.RowSource = ""(ListBox1.RowSource = "'[data.xls]tblcustom'!A:D"=FALSE)
ผมคิดว่าต้องไปสั่งให้เวิร์บุคที่กำหนดตอบสนองก่อน
Private Sub UserForm_Initialize()
Dim mydata AS Range
ActiveWorkbook("data.xls").Worksheets("tblcustom").Select
With Workbooks("data.xls").Worksheets("tblcustom").Activate
Set myData = Workbooks("data.xls").Worksheets("tblcustom").Range("A:Z")
ListBox1.RowSource = mydata :mrgreen: :rz:
คือคิดว่า 1.ต้องสั่งให้มันรู้ก่อนว่าเวิร์กบุคไหน 2.จะเอาอะไร 3.จะให้ไปแสดงที่ไหน
แต่Debug ครับ :mrgreen:

ความตั้งใจของผมที่จะเรียนรู้คือต่อไป สมมติว่าเราดึงข้อมูลมาอยู่ในListBox ผมก็จะลองใช้คำสั่งร่วมกับFilter เพื่อกำหนดการกรองค้นหาตามฟิล์ที่ผู้ใช้กำหนดข้ามเวิร์กบุค เช่นหาจากชื่อ หรือเลขบัตร
แล้วค่าข้อมูลในListbox ก็แสดงค่าตามการกำหนด Filter แล้วพอเลือกรายการในListBox ก็แสดงข้อมูลของรายนั้นออกมาบนหน้าฟอร์ม
ประมาณว่าอยากดูหนี้ที่ไม่เกิน50000บาทก็แสดงในList เลย สนใจรายไหนในกลุ่มนั้นก็คลิ๊กเลือก ข้อมูลรายนั้นก็โผล่เลย! :lol:
ซึ่งตอนนี้ใช้ code = Application.Match(.Range("F4"), .Range("A:A"), 0)ที่อาจารย์สอนดึงข้อมูลมาแสดงในlistBox และสามารถเลือกรายการและแสดงผลได้แล้วครับ
แต่ตอนนี้ได้เป็นรายคน :roll: ก็จะค่อยๆเรียนรู้และทำไปครับ
ขอบคุณมากครับที่คอยแนะนำ ขอบคุณอาจารย์ที่อดทนกับผม

Re: Application.WorksheetFunction.VLookup

Posted: Mon Jun 27, 2011 11:17 am
by snasui
Bafnet wrote:จากการกำหนดค่าข้ามเวิร์กบุค มันมีปัญหาคือ ถ้าเวิร์กบุคที่เราอ้างถึงเราไม่ได้เปิดใช้งานก็เกิดdebug คือเวิร์กบุคที่ผมอ้างถึงเป็นที่ที่ผมส่งข้อมูลที่บันทึกไปเก็บไว้ ไม่ต้องการเปิด
แต่อยากให้แค่ดึงข้อมูลมาใช้
หากไม่เปิดขึ้นมาก่อนคิดว่าขั้นตอนเยอะขึ้นครับ ดูตัวอย่าง Code ที่นี่แล้วลองปรับใช้ดูครับ
http://www.ozgrid.com/VBA/ExtractFromClosedWorkbook.htm
http://www.exceltip.com/st/Read_informa ... l/473.html
http://www.erlandsendata.no/english/ind ... omclosedwb