: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

Application.WorksheetFunction.VLookup

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Application.WorksheetFunction.VLookup

#1

Post by Bafnet »

สวัสดีครับอาจารย์ มีเรื่องรบกวนอีกแล้วครับ ผมซื้อหนังสือของอ.วิศัลย์ พัวรุ่งโรจน์
ก็ทำตามหนังสือบอกทุกอย่าง ตามไฟล์แนบ แต่มันDebug
ผมไม่เข้าใจ...คล้ายๆกับว่าApplication.WorksheetFunction.VLookup ยังไม่พร้อมใช้งาน
รบกวนอาจารย์หรือพี่ผู้รู้อธิบายหน่อยนะครับว่าเป็นเพราะอะไร และหากต้องการใช้Application.WorksheetFunction.VLookupนี้ให้ได้ต้องทำอย่างไร
ขอเป็นคำอธิบายแบบกระจ่างเลยนะครับ เอาแบบเป็นขั้นตอนเลยนะครับ :lol: ผมพื้นฐานน้อย
ขอบพระคุณครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#2

Post 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 ไว้ด้วยครับ
You do not have the required permissions to view the files attached to this post.
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#3

Post by Bafnet »

ขอบคุณมากๆครับ มันเป็นความอ่อนด้อยของผมเอง เมื่อมาพิจารณาดูจากที่อาจารย์อธิบายแล้วก็พบว่าในตัวอย่างของหนังสือนั้น
ใช้รหัสสินค้าเป็น B2001,B2002 ซึ่งมีค่าเป็นText ส่วนเลขทะเบียนลูกค้าผมเป็น 001,002...
ชักจะท้อแล้วครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#4

Post by snasui »

อย่าเพิ่งท้อครับ การเขียน Code ต้องอาศัยเขียนบ่อย ๆ และเท่าที่เห็นไฟล์ตัวอย่างที่ผ่าน ๆ มา มีการบันทึก Macro มาดูตัวอย่าง Code ผมถือว่ามาถูกทางแล้ว ขอเป็นกำลังใจให้ครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#5

Post by Bafnet »

สวัสดีครับอาจารย์ วันนี้มีปัญหามารบกวนอีกแล้วครับ
เรื่อง
1.การรับค่าที่เป็นวันที่ของTextBox ครับ ตอนนี้มันส่งค่าออกมาเป็นข้อความครับ
2.TextBox ระหว่างฟอร์ม
3.การส่งค่าไปบันทึก แก้ไข หรือลบค่าที่เลือกทิ้งไป
4.การกำหนดรูปแบบ TextBox
ผมรบกวนอาจารย์ทำให้ดูเป็นตัวอย่างหน่อยนะครับ
คราวที่แล้วอาจารย์ให้วิธีเขียน Target มา ผมไม่ทราบว่าจะนำไปใช้อย่างไร ต้องนำไปสร้างเป็น ชื่อสูตร หรือเขียนในวีบี ทำไม่เป็นจริงๆครับ
ผมหวังว่าอาจารย์คงไม่รำคาญผมนะครับ ขอบคุณมากครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#6

Post 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 เดิมและแจ้งปัญหามาด้วยจะได้ช่วยดูต่อครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#7

Post 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ล่ะ เขากำหนดยังไงเพื่อให้แสดงค่าแบบนี้
ครับก็คงเรียนชี้แจงอาจารย์เพียงเท่านี้ ผมอาจจะอยากทำนั้นทำนี่มากไปหน่อย ซึ่งอาจทำให้อาจารย์ไม่สะดวกใจ หรือระอาใจ ก็ต้องขออภัยอาจารย์ด้วยนะครับ ในความอยากรู้แต่ไม่มีความรู้ของผม
จะพยายามต่อไปครับ ขอบคุณอาจารย์มากๆครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#8

Post 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
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#9

Post 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
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#10

Post by Bafnet »

สวัสดีครับอาจารย์
ผมขอขอบคุณในความกรุณาของอาจารย์มากๆครับ
คำสอนของอาจารย์เป็นประโยชน์มากครับ ทำให้เห็นว่าในโครงสร้างของวีบีนั้นเป็นอย่างไร
เริ่มเข้าใจการกำหนดค่า การตั้งชื่อ เราสั่งให้มันทำอะไรก็ได้ถ้ารู้จักกำหนดค่าตัวแปร แต่ที่มีประโยชน์มากที่สุดคือเรื่อง On Error Resume Next
ขอบคุณมากครับที่ทำให้รู้ว่า ค่าที่เป็นข้อความ กับตัวเลขนั้นต่างกันอย่างไรในการให้ Exell คำนวณ
สนุกมากครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#11

Post 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
ชอบคุณครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#12

Post by Bafnet »

อาจารย์ครับต้องขออภัยด้วย ที่คำลงท้ายผมตกหล่น ขอบคุณครับ แต่ที่พิมพ์กลับเป็นชอบคุณครับ
มีเรื่องเรียนถามอีกสักนิดนะครับ เรื่องของListbox
เราสามารถกำหนดให้ListBox แสดงข้อมูลของข้อมูลที่อยู่คนละWorkbookได้ไหมครับ
ตรงที่ช่องกำหนดค่าRowsource เรากำหนดได้ในลักษณะที่กล่าวมาได้หรือไม่ครับ
รบกวนแนะนำหน่อยนะครับ
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#13

Post 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
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: Application.WorksheetFunction.VLookup

#14

Post 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: ก็จะค่อยๆเรียนรู้และทำไปครับ
ขอบคุณมากครับที่คอยแนะนำ ขอบคุณอาจารย์ที่อดทนกับผม
User avatar
snasui
Site Admin
Site Admin
Posts: 30761
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: Application.WorksheetFunction.VLookup

#15

Post 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
Post Reply