: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

สอบถาม vlookup vba ครับ

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

สอบถาม vlookup vba ครับ

#1

Post by lnongkungl »

สวัสดีครับอาจารย์ วันนี้ผมมีเรื่องรบกวนสอบถามเกี่ยวกับการใช้ vlookup ด้วย vba ครับ

ผมกำลังฝึกใช้ vba ครับ เลยยังไม่ค่อยเข้าใจอย่างถ่องแท้

ผมจะ vlookup ข้าม sheet ครับ ลองเขียน code ดูก็ไม่มี error ครับ แต่ก็ไม่แสดงผลอะไรเลยเช่นกัน รบกวนอาจารย์ช่วยดูหน่อยครับว่าผมทำผิดตรงไหน ซึ่งตอนทดลองทำผมก็เปิดไฟล์ไว้ทั้ง 2 ไฟล์ครับ

Code: Select all

Sub lookup()
Dim name, lname As Range

Set name = Range("A2")
Set lname = Range("B2")

With Workbooks("a.xlsx").Worksheets(1)
Dim myrange As Range
Set myrange = Range("A:B")
End With

lname.Value = Application.WorksheetFunction.VLookup(name, myrange, 2, False)


End Sub
Attachments
a.xlsx
(8.88 KiB) Downloaded 9 times
b.xlsm
(14 KiB) Downloaded 9 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#2

Post by puriwutpokin »

ปรับตามนี้ครับ

Code: Select all

Sub lookup()
Dim name, lname As Range
Set name = Range("A2:A8")
Set lname = Range("B2:B8")
With Workbooks("a.xlsx").Worksheets(1)
Dim myrange As Range
Set myrange = .Range("A:B")
End With
lname.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 2, False), "")
End Sub
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#3

Post by lnongkungl »

ได้แล้วครับ แต่ผมรบกวนช่วยอธิบายตรงจุดที่ผมผิดพลาดให้หน่อยครับ ผมจะได้เอาไปปรับใช้ต่ออีกครับ
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#4

Post by puriwutpokin »

lnongkungl wrote: Mon Feb 17, 2020 2:15 pm ได้แล้วครับ แต่ผมรบกวนช่วยอธิบายตรงจุดที่ผมผิดพลาดให้หน่อยครับ ผมจะได้เอาไปปรับใช้ต่ออีกครับ
ตรงนี้ครับ

Code: Select all

With Workbooks("a.xlsx").Worksheets(1)
Dim myrange As Range
Set myrange = .Range("A:B")
End With
เมื่อใช้ With แล้ว ช่วงที่กำหนด ต้องการให้สื่อถึง Workbooks("a.xlsx").Worksheets(1)
คือ ใส่จุด จาก

Code: Select all

 Range("A:B")
เป็น

Code: Select all

.Range("A:B")
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#5

Post by lnongkungl »

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

Code: Select all

Sub lookup()
Dim name, lname, r, t, m, e, sg As Range
Set name = Range("C4")
Set lname = Range("E4")
Set r = Range("G4")
Set t = Range("C7")
Set m = Range("C8")
Set e = Range("C9")
Set sg = Range("E12")
With Workbooks("a.xlsx").Worksheets(1)
Dim myrange As Range
Set myrange = .Range("A:G")
End With
lname.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 2, False), "")
r.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 3, False), "")
t.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 4, False), "")
m.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 5, False), "")
e.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 6, False), "")
sg.Value = Application.IfError(Application.WorksheetFunction.VLookup(name, myrange, 7, False), "")
End Sub
Attachments
a.xlsx
(9.05 KiB) Downloaded 10 times
b.xlsm
(17.51 KiB) Downloaded 10 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#6

Post by puriwutpokin »

ย่อได้เท่านี้ครับ
ลองดู

Code: Select all

Sub lookup()
Dim name, lname, myrange As Range
Set name = Range("C4")
Set lname = Range("E4")
With Workbooks("a.xlsx").Worksheets(1)
Set myrange = .Range("A:G")
End With
With Application
lname.Value = .IfError(.VLookup(name, myrange, 2, 0), "")
Range("G4") = .IfError(.VLookup(name, myrange, 3, 0), "")
Range("C7") = .IfError(.VLookup(name, myrange, 4, 0), "")
Range("C8") = .IfError(.VLookup(name, myrange, 5, 0), "")
Range("C9") = .IfError(.VLookup(name, myrange, 6, 0), "")
Range("E12") = .IfError(.VLookup(name, myrange, 7, 0), "")
End With
End Sub
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#7

Post by lnongkungl »

ขอบคุณครับ
ความหมายก็คือ ลดการประกาศตัวแปรเพิ่ม แค่เพิ่มตำแหน่งการ vlookup ถูกต้องมั้ยครับ

เดี๋ยวจะลองเอาไปปรับใช้กับของจริงดูครับ ติดตรงไหน จะเข้ามาขอความรู้เพิ่มเติมอีกครับ
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#8

Post by lnongkungl »

เจอปัญหาใหม่ครับ เมื่อ vlookup มาแล้ว มีการแก้ไขข้อมูล แล้วจะส่งข้อมูลไปบันทึกต่อท้ายตาราง แต่มันติด error ในการหาช่องว่างใน cell สุดท้ายของ row ครับ

Code: Select all

..Other code
name.Copy
Application.ScreenUpdating = False
Workbooks.Open ("C:\Users\it-support.cmk\Desktop\àÅÕ¹ẺDBform\a.xlsx")
Range("A" & Row.Count).End(xlUp).PasteSpecial xlPasteValues 'ติดที่บรรทัดนี้ครับ error ตลอด แก้ยังไงก็ติดทุกที
Application.CutCopyMode = fasle
Other code...
รบกวนด้วยครับ
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#9

Post by puriwutpokin »

ลองแนบไฟล์ตัวอย่างล่าสุดพร้อมโค้ดที่เกี่ยวข้องมาดูครับ จะได้เข้าถึงปัญหาได้ไวครับ
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#10

Post by lnongkungl »

แนบไฟล์ทดสอบครับ
Attachments
a.xlsx
(9.05 KiB) Downloaded 11 times
b.xlsm
(19.57 KiB) Downloaded 9 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#11

Post by puriwutpokin »

ปรับเป็น

Code: Select all

' Other code...
Application.ScreenUpdating = False
Workbooks.Open ("C:\Users\it-support.cmk\Desktop\เลียนแบบDBform\a.xlsx")
name.Copy
Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
' Other code...
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#12

Post by lnongkungl »

ก็ยังติดเหมือนเดิมครับ บรรทัดเดิมเลย
Attachments
Capture.PNG
Capture.PNG (10.75 KiB) Viewed 218 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#13

Post by puriwutpokin »

ลองแนบไฟล์ที่ใส่โค้ดนี้มาดูครับ
ไม่ก็ลองไฟล์นี้ดูครับ ผมรันก็ปกติครับ
Attachments
b.xlsm
(19.01 KiB) Downloaded 12 times
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#14

Post by lnongkungl »

งง เหมือนกันครับ ช่วยดูให้ทีครับว่าผมพิมพ์อะไรผิดตรงไหน ผมก็เช็คดีแล้วนะครับว่ามันก็ไม่ผิด แต่ทำไมถึง error ไล่ดูทุกตัวอักษรก็ไม่ผิดนะครับ หรือผมพลาดตรงไหน

แต่ไฟล์ที่ท่าน puriwutpokin แนบมาผมเอามา run ได้นะครับ

งงไปใหญ่
Attachments
b.xlsm
(19.58 KiB) Downloaded 10 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#15

Post by puriwutpokin »

ผิด 2 จุดครับ

Code: Select all

Range("A" & Row.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
ต้องเป็น ตกตัว Rows.Count ไม่ใส่ตัว S ตกไปครับ

Code: Select all

Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
และตรงนี้

Code: Select all

Application.CutCopyMode = fasle
ต้องเป็น สลับตำแหน่ง S กับ L

Code: Select all

Application.CutCopyMode = False
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#16

Post by lnongkungl »

ขอบคุณครับ ผมว่าผมหาดีแล้วนะ ยังพลาดได้

เมื่อเขียนครบจน run ได้ตามต้องการแล้ว ทีนี้มาดูในส่วนของการ copy ไปใส่ข้อมูลอีกที่นึง ดูแล้วมันจะยาวมากเลยครับ ขนาดแค่สร้างตารางมาเพื่อลองเขียนสูตรเล็กๆ ยังยาวขนาดนี้ พอจะมี Loop หรือ code ที่จะเขียนสั้นเพื่อลดความยาวของสูตรในจุดนี้ได้มั้ยครับ เพราะงานจิง column ยาวเป็น 100 เลย ไฟล์ตัวอย่างทดสอบนี่แค่ 7 column เองยังยาวขนาดนี้

Code: Select all

Sub save()
Dim name, lname, r, t, m, e, sg As Range
Set name = Range("C4")
Set lname = Range("E4")
Set r = Range("G4")
Set t = Range("C7")
Set m = Range("C8")
Set e = Range("C9")
Set sg = Range("E12")

'ตั้งแต่ตรงนี้
Application.ScreenUpdating = False
Workbooks.Open ("C:\Users\it-support.cmk\Desktop\àÅÕ¹ẺDBform\a.xlsx")
name.Copy
Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
lname.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
r.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 2).PasteSpecial xlPasteValues
Application.CutCopyMode = False
t.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 3).PasteSpecial xlPasteValues
Application.CutCopyMode = False
m.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 4).PasteSpecial xlPasteValues
Application.CutCopyMode = False
e.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 5).PasteSpecial xlPasteValues
Application.CutCopyMode = False
sg.Copy
Range("A" & Rows.Count).End(xlUp).Offset(0, 6).PasteSpecial xlPasteValues
Application.CutCopyMode = False
'ถึงตรงนี้

Workbooks("a.xlsx").save
Workbooks("a.xlsx").Close


End Sub
Attachments
a.xlsx
(9.14 KiB) Downloaded 10 times
b.xlsm
(20.3 KiB) Downloaded 15 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#17

Post by puriwutpokin »

ลองปรับเป็น

Code: Select all

Sub save()
Dim name, lname, r, t, m, e, sg As Range
Set name = Range("C4")
Set lname = Range("E4")
Set r = Range("G4")
Set t = Range("C7")
Set m = Range("C8")
Set e = Range("C9")
Set sg = Range("E12")
Application.ScreenUpdating = False
Workbooks.Open ("C:\Users\it-support.cmk\Desktop\เลียนแบบDBform\a.xlsx")
 Range("A" & Rows.Count).End(xlUp).Offset(1).Value = name.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 1).Value = lname.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 2).Value = r.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 3).Value = t.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 4).Value = m.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 5).Value = e.Value
 Range("A" & Rows.Count).End(xlUp).Offset(, 6).Value = sg.Value
 ActiveWorkbook.save
 ThisWorkbook.Activate
 Application.ScreenUpdating = True
End Sub
:shock: :roll: :D
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#18

Post by lnongkungl »

ขอบคุณครับท่าน puriwutpokin น่าจะลด code ได้หลายบรรทัดเลย เดี๋ยวลองดูครับ
lnongkungl
Member
Member
Posts: 92
Joined: Tue Nov 14, 2017 11:04 am
Excel Ver: 2013

Re: สอบถาม vlookup vba ครับ

#19

Post by lnongkungl »

เจอปัญหาอีกแล้วครับ เมื่อ cell บาง cell ต้องพิมพ์ ==== หรือ ---- เพื่อเป็นตัวปิดยอดรวม ซึ่งมันใช้ border ของ cell ไม่ได้ เพราะมันจะไม่ตรงกับข้อความที่เราใส่เข้าไป ผมลอง copy ภายใน sheet เดียวกันไม่มีปัญหา code ไม่ติดอะไร

แล้วปัญหาก็ติดอยู่ที่ว่า เมื่อ copy.value ข้าม sheet แล้ว code จะ error ทันทีเมื่อเจอข้อความชุดนี้ เพราะจะติดข้อความถามให้ใส่ ' ให้ของ excel

ผมใช้ application.displayalerts = true ก็ไม่ได้ผลครับ พยายามหาใน google แล้วก็ไม่เจอซักที

รบกวนด้วยครับ
Attachments
Capture.PNG
Capture.PNG (15.38 KiB) Viewed 179 times
a.xlsx
(9.39 KiB) Downloaded 16 times
b.xlsm
(20.86 KiB) Downloaded 17 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

Re: สอบถาม vlookup vba ครับ

#20

Post by puriwutpokin »

เปลี่ยน เอา Value ออกตามนี้ครับ

Code: Select all

 Range("A" & Rows.Count).End(xlUp).Offset(1) = name
 Range("A" & Rows.Count).End(xlUp).Offset(, 1) = lname
 Range("A" & Rows.Count).End(xlUp).Offset(, 2) = r
 Range("A" & Rows.Count).End(xlUp).Offset(, 3) = t
 Range("A" & Rows.Count).End(xlUp).Offset(, 4) = m
 Range("A" & Rows.Count).End(xlUp).Offset(, 5) = e
 Range("A" & Rows.Count).End(xlUp).Offset(, 6) = sg
:shock: :roll: :D
Post Reply