Page 1 of 1

ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Wed Nov 22, 2017 3:59 pm
by lnongkungl
ผมไม่รู้จะอธิบายยังไงครับ เอาให้เห็นภาพเลยละกัน
คือผมจำลองตารางมาครับเพื่อให้เห็นภาพง่ายๆ จริงๆข้อมูลเยอะกว่านี้มาก
สิ่งที่ผมต้องการคือ เมื่อพิมพ์รหัสไปแล้วใน sheet อื่น พอกด Enter รหัสนั้นจะกลายเป็นชื่อสินค้าครับ
คือจริงๆ ใช้ vlookup ก็ได้ แต่ขอบเขตอ้างอิงมีแค่แถวเดียวคือ แถว หรือ cell ที่คีย์ ข้อมูลลงไป เพราะ vlookup มันอ้างอิง cell มันเองไม่ได้ หรือผมทำไม่เป็น.....

ตัวอย่างคือ สมมุติว่า เราคีย์ 111 ลงใน A1 ของ sheet2 เมื่อกด Enter หรือ เปลี่ยน cell ให้ 111 กลายเป็นคำว่า แป้ง ประมาณนี้ครับ

พอจะมีสูตรหรือ code vba แนะนำมั้ยครับ ผมพยายามหาใน google แล้ว หมดสติปัญญาจริงๆ ครับ ผมหาไม่เจอหรือผมใช้คีย์หาไม่ถูกก็ไม่รู้

รบกวนทุกท่านด้วยครับ

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Wed Nov 22, 2017 4:40 pm
by puriwutpokin
ถ้าจะใช้เป็น VBA ต้องเขียนมาเองการครับ ตามกฏของบอร์ด เบิ้องต้อง ถ้าคีย์เซลนั้นแล้วขึ้น ค่าเมื่อมีการเปลี่ยนแปลง
ต้องใช้เป็น VBA Event ครับใส่โค้ดที่ชีทที่ต้องการให้เมื่อมีการเปลี่ยนแปลงครับ ลองค้นหาจากคำว่า
VBA Vlookup ใน Google ก่อนครับติดขัดมาถามกันในนี้ครับ

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 10:26 am
by lnongkungl
พอหาได้ประมาณนี้ครับ แต่ก็ error ตัวแปรสุดท้าย ผมก็กำหนดให้เป็นตัวหนังสือ แต่มันฟ้อง mismacth ครับ

Code: Select all

Sub vl()
Dim e  As Range
Dim Lookup_Range As Range
Dim r As String
Set e = Range("a2:a4")
Set Lookup_Range = Range("a2:b4")
r = Application.WorksheetFunction.VLookup(e, Lookup_Range, 2, False)
End Sub
หรือผมยังใช้ code ไม่ถูกครับ

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 11:11 am
by puriwutpokin
ควรแนบไฟล์ตัวอย่างมาด้วยครับจะได้เข้าใจตรงกันครับ และระบุ ดาต้า และเซลที่จะให้แสดงค่ามาครับ

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 2:52 pm
by lnongkungl
ตารางอยู่ sheetแรก ครับ
cell a1 sheet2 ที่ต้องการให้ข้อมูลแสดงครับ

Code: Select all

Sub vl()
Dim e  As Range
Dim Lookup_Range As Range
Dim r As String
Set e = Sheets(1).Range("a2:a4")
Set Lookup_Range = Sheets(1).Range("a2:b4")
r = Application.WorksheetFunction.VLookup(e, Lookup_Range, 2, False)
End Sub

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 4:02 pm
by puriwutpokin
ตัวอย่างโค้ดครับ เปิด Alt+F11 เลือกชีท Sheet2
ใส่โค้ดที่ปรับตามนี้ครับ

Code: Select all

Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim e  As Range
Set e = Sheet2.Range("a1:a4")
Set Lookup_Range = Sheet1.Range("a2:b4")
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, e) Is Nothing Then
    If Target.Value <> "" Then
        Application.EnableEvents = False
        Target.Value = Application.WorksheetFunction.VLookup(Target.Value, Lookup_Range, 2, False)
        Application.EnableEvents = True
    End If
End If
End Sub

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 5:00 pm
by lnongkungl
ได้แล้วครับ ขอบคุณครับ แต่ผมรบกวนนิดนึงได้หรือปล่าวครับ
คือผมไม่คุ้นกับ คำสั่งนี้ครับ

ช่วยอธิบายเป็นภาษาพูด ให้หน่อยครับ

If Not Intersect(Target, e) Is Nothing Then
If Target.Value <> "" Then
Application.EnableEvents = False
Target.Value = Application.WorksheetFunction.VLookup(Target.Value, Lookup_Range, 2, False)
Application.EnableEvents = True
End If
End If

ผมจะได้เข้าใจและเอาไปประยุกต์กับงานจริงครับ


ขอบคุณครับ

Re: ขอสอบเรื่องการพิมพ์รหัสแล้วให้กลายเป็นชื่อสินค้าครับ

Posted: Thu Nov 23, 2017 5:25 pm
by puriwutpokin

Code: Select all

Not Intersect(Target, e) Is Nothing
Intersect คือการที่ค่า Target นั้นอยู่ในช่วง e อินเตอร์เซคกัน ถ้าไม่ใช่ช่วงดังกล่าว
เป็น False ไม่ต้องทำต่อ แต่ถ้าอยู่หรืออินเตอร์เซค เป็น True ก็ไปต่อ
คำสั่ง

Code: Select all

Application.EnableEvents
เวลาเขียนโค้ดที่ให้รันทันทีเวลาเปลี่ยนแปลงค่าในเซลล์ครับ
เพื่อป้องกันไม่ให้รันโค้ดประเภท event เช่น worksheet_change ฯลฯ ซ้ำซ้อนกันระหว่างที่โค้ดปัจจุบัน
กำลังทำงานอยู่ครับ False และให้กลับมาตอนจบเป็น True
ประมาณนี้ครับ ลองค้นคว้าดูอีกทีละกันครับ