Page 1 of 2
ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Sun Aug 04, 2013 9:56 pm
by pongpang
ใน Use Form เมื่อต้องการตรวจสอบข้อมูล พิมพ์ชื่อ แล้วให้ข้อมูลของชื่อนั้น แสดง ปรากฏว่า เขียน Code แล้ว Error ตามไฟล์ที่แนบครับ
ขอความกรุณาให้คำแนะนำในการเขียน Code ที่ถูกต้องด้วยครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Mon Aug 05, 2013 8:00 am
by snasui

Index และ Match เอาไปใช้ใน VBA ตรง ๆ แบบนั้นไม่ได้ครับ เพราะไม่ใช่ Function ใน VBA แต่เป็น Function ใน Excel หากจะนำไปใช้ต้องนำหน้าด้วย Application เช่น
Application.Index,
Application.Match ซึ่งเป็นการอ้างอิงแบบย่อ หากแบบเต็มจะเขียนเป็น
Application.WorksheetFunction.Index,
Application.WorksheetFunction.Match
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Mon Aug 05, 2013 11:53 am
by pongpang
snasui wrote: Index และ Match เอาไปใช้ใน VBA ตรง ๆ แบบนั้นไม่ได้ครับ เพราะไม่ใช่ Function ใน VBA แต่เป็น Function ใน Excel หากจะนำไปใช้ต้องนำหน้าด้วย Application เช่น Application.Index, Application.Match ซึ่งเป็นการอ้างอิงแบบย่อ หากแบบเต็มจะเขียนเป็น Application.WorksheetFunction.Index, Application.WorksheetFunction.Match
เรียน คุณคนควน
ผมพยายามแล้วครับ ไม่ ERROR ครับ แต่ข้อมูลไม่แสดง ในTexBox ครับ ขอความกรุณาช่วยแนะนำด้วยเถอะครับ (เป็นเพียงส่วนหนึ่งที่ได้พยายาม) เช่น
Code: Select all
Private Sub TextBox2_text()
Application.IndexApplication.WorksheetFunction.Index
Set LastRow = TextBox1.Text
LastRow.Index(Range(Data), Match(TextBox1.Text, Range(Name), 0), 2) = TextBox2.Text
End Sub
Private Sub TextBox3_value()
Application.IndexApplication.WorksheetFunction.Index
Set LastRow = TextBox1.Value
LastRow.Index(Range(Data), Match(TextBox1.Value, Range(Name), 0), 3) = TextBox3.Value
End Sub
Private Sub TextBox2_Change()
Set LastRow = Sheet1.Range("a65536").End(xlUp)
Application.IndexApplication.WorksheetFunction.Index
Set LastRow = TextBox1.Text
LastRow.Index(Range(Data), Match(TextBox1.Text, Range(Name), 0), 2) = TextBox2.Text
End Sub
Private Sub TextBox2_value()
Set LastRow = Sheet1.Range("a65536").End(xlUp)
Application.IndexApplication.WorksheetFunction.Index_
Application.IndexApplication.WorksheetFunction.Match
Set LastRow = TextBox1.Value
LastRow.Index(Range(Data), Match(TextBox1.Value, Range(Name), 0), 2) = TextBox2.Text
End Sub
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Mon Aug 05, 2013 2:30 pm
by snasui

ลองดูตัวอย่างตามด้านล่างครับ
Code: Select all
'Other code
With Application
TextBox2.Text = .Index(Data,.Match(LastRow,Name,0),2)
End With
'Other code
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 11:39 am
by pongpang
เรียน คุณคนควน
ขอบคุณมากครับที่ได้กรุณา ได้พยามนำ Code ไปใช้ โดยเขียน Code ดังนี้
Code: Select all
Private Sub TextBox2_Change()
Application.IndexApplication.WorksheetFunction.Index
Set LastRow = TextBox1.Text
With Application
TextBox2.Text = .Index(Data, .Match(LastRow, Name, 0), 2)
End With
End Sub
แต่ข้อมูลไม่แสดงครับ ขอความกรุณช่วยแนะนำเพิ่มเติมด้วยครับ โดยขอ Code ที่เต็มรูปแบบครับ
ตามไฟล์ที่แนบครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 6:03 pm
by snasui

ให้ลบ
Application.IndexApplication.WorksheetFunction.Index ทิ้งไปหรือ Mark เป็น Comment
สำหรับ
Name ใน Code ที่เขียนมาหมายถึงอะไร กำหนดค่าให้กับตัวแปรเป็นช่วงข้อมูลใดครับ

Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 8:47 pm
by pongpang
snasui wrote:
ให้ลบ
Application.IndexApplication.WorksheetFunction.Index ทิ้งไปหรือ Mark เป็น Comment
snasui wrote:สำหรับ Name ใน Code ที่เขียนมาหมายถึงอะไร กำหนดค่าให้กับตัวแปรเป็นช่วงข้อมูลใดครับ
เรียน คุณคนควน
ขอบคุณมาก ผมได้ปรับ Code ตามคำแนะนำแล้ว ครับ
แต่ข้อมูล ยังไม่แสดง ครับ
สำหรับ Name เป็นชื่อของ เร้งเนม( sheet1!A2:A5) เป็นคอลัมน์ Name(ชื่อ)ครับ
และ Data คือ เร้งเนม (Sheet1!A2:C5) เป็นเร้งของข้อมูลทั้งหมดครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 8:55 pm
by snasui

เมื่อเป็น Range Name จะเอามาใช้ใน Code ตรง ๆ เช่นนั้นไม่ได้ครับ จะต้องเขียนเป็น
เช่น
Code: Select all
'Other code
Dim Data As Range
Dim Name As Range
Set Data = ActiveSheet.Range("Data")
Set Name = ActiveSheet.Range("Name")
LastRow = TextBox1.Text
With Application
TextBox2.Text = .Index(Data, .Match(LastRow, Name, 0), 2)
End With
'Other code
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 9:21 pm
by pongpang
เรียน คุณคนควน
ขอบคุณมากครับ ที่ได้กรุณา ผมได้พิมพ์ Code ตามที่แนะนำแล้วแต่ข้อมูลยังไม่แสดงครับ และผมได้พยายามปรับ Code เช่น
ทั้งใส่และลบ Application.IndexApplication.WorksheetFunction.Index........With Application
ข้อมูลก็ไม่แสดง
ขอความกรุณาช่วยเหลือด้วยนะครับ ขอบคุณล่วงหน้า
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 10:24 pm
by snasui

บรรทัดใดที่ผมแนะนำว่าให้ลบไปหรือ Mark เป็น Comment ให้ละเลยไปได้เลย ไม่ต้องนำมาใช้สำหรับงานนี้อีก
กรณีนำ Code นั้นไปปรับใช้แล้วให้แนบไฟล์ล่าสุด พร้อม Code และแจ้งมาด้วยว่าคำตอบที่ต้องการเป็นอย่างไรครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 11:07 pm
by pongpang
เรียน คุณคนควน
ขอบคุณมากครับ สำหรับ Code ที่นำไปใช้และปรับครั้งล่าสุด ดังนี้ ครับ
Code: Select all
Private Sub TextBox2_Change()
Dim Data As Range
Dim Name As Range
Set Data = ActiveSheet.Range("Data")
Set Name = ActiveSheet.Range("Name")
LastRow = TextBox1.Text
TextBox2.Text = .Index(Data, .Match(LastRow, Name, 0), 2)
End With
End Sub
และตามไฟล์ที่แนบครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 11:34 pm
by snasui

ลองดูตัวอย่างการปรับ Code ตามด้านล่างครับ
Code: Select all
Private Sub TextBox1_Change()
Dim Data As Range
Dim Name As Range
Dim lastRow As Integer
Dim checkVal As Long
Set Data = ActiveSheet.Range("Data")
Set Name = ActiveSheet.Range("Name")
With Application
checkVal = .CountIf(Name, TextBox1.Text)
If checkVal > 0 Then
lastRow = .Match(TextBox1.Text, Name, 0)
TextBox2.Text = .Index(Data, lastRow, 2)
Else
TextBox2.Text = ""
End If
End With
End Sub
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Tue Aug 06, 2013 11:50 pm
by pongpang
เรียน คุณคนควน
ขอบคุณมากครับ สามารถแสดงข้อมูลได้ครบถ้วนทุกประการครับ และถ้าจะกรุณาช่วยอธิบาย คำเหล่านี้
As Range
As Integer
checkVal As Long
หมายถึงอะไร จะเป็นพระคุณอย่างยิ่ง และขอขอบคุณล่วงหน้าครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Wed Aug 07, 2013 6:52 am
by snasui

ทั้งหมดนั้นเป็นการประกาศตัวแปรครับ
As Range คือประกาศตัวแปรเป็น Object ของ Excel โดย Range หมายถึงช่วงข้อมูล ใช้หน่วยความจำ 4 bytes
การประกาศตัวแปรส่วนที่เหลือดูจากที่นี่ครับ
Data Type Summary
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Wed Aug 07, 2013 11:24 am
by pongpang
ขอบคุณมากครับ ที่ได้ให้ความกรุณา
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Fri Aug 09, 2013 3:41 pm
by pongpang
เรียน อาจารย์คนควนและอาจารย์ทุกท่าน
ตากที่สร้างไฟล์โดยใช้ User Form ในการบันทึกข้อมูลและคืนค่าข้อมูล เมื่อปรับปรุงไฟล์ เกิดปัญปัญหา คือ
เมื่อเปลี่ยนจาก TextBox เป็น ComboBox มีปัญหา ดังนี้ ครับ
1. ใช้บันทึกข้อมูลไม่ได้
2. ใช้ในการค้นหาข้อมูลก็ไม่ได้
จะ Error ตามภาพ
ไม่ทราบว่าจะต้องปรับปรุง Code ที่ส่วนใด ขอความกรุณาด้วยครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Fri Aug 09, 2013 4:18 pm
by snasui

ลองปรับบรรทัดที่มีปัญหาเป็นตามนี้ครับ
lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
สังเกตว่าหากมีการ Assign ค่าให้กับตัวแปรแล้วจะไม่ครอบด้วยฟันหนู ใน Code ตัวแปร Num จะ
ไม่เขียนเป็น "Num"
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Fri Aug 09, 2013 5:01 pm
by pongpang
snasui wrote:
ลองปรับบรรทัดที่มีปัญหาเป็นตามนี้ครับ
lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
เรียน คุณคนควน
ขอบคุณมากครับ แต่ยัง Error และพบปัญหาดังนี้ ครับ
1.ไม่สามารถป้อนข้อมูลใหม่ได้โดยพิมพ์ตัวแรกก็จะ Error ทันทึที่ lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
Code: Select all
Private Sub ComboBox1_Change()
Dim Num As Range 'Num:rangename Column เลขที่
Dim Alldata As Range 'AllData:rangename ข้อมูลทั้งหมด(ทุกColumn)
Dim lastRow As Integer
Dim checkVal As Long
Set Alldata = ActiveSheet.Range("AllData")
Set Num = ActiveSheet.Range("Num")
With Application
checkVal = .CountIf(Num, ComboBox1.Text)
If checkVal > 0 Then
lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
TextBox1.Text = .Index(Alldata, lastRow, 1)
TextBox2.Text = .Index(Alldata, lastRow, 2)
TextBox3.Text = .Index(Alldata, lastRow, 3)
TextBox4.Text = .Index(Alldata, lastRow, 4)
TextBox5.Text = .Index(Alldata, lastRow, 5)
Else
ComboBox1.Text = ""
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
End If
End With
End Sub
2.เมื่อเลือกเลขที่เก่า ก็จะแสดงข้อมูลแต่ข้อมูลคลาดเคลื่อนดังภาพ
ขอความกรุณาแนะนำด้วยครับ
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Fri Aug 09, 2013 5:17 pm
by snasui

ลองปรับ Code เป็น
Code: Select all
'Other code
If ComboBox1.Text <> "" And checkVal > 0 Then
'Other code
สำหรับค่าที่ไม่ตรงนั้นให้ดูว่า Range Name ที่ให้ไว้
เริ่มที่คอลัมน์ใดหมายถึงคอลัมน์นั้นมีค่าเป็น 1 ในฟังก์ชั่น Index ดังนั้น การจะให้แสดงชื่อควรจะเป็น Code
TextBox1.Text = .Index(Alldata, lastRow, 1) หรือควรเป็น
TextBox1.Text = .Index(Alldata, lastRow, 2) 
Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ
Posted: Fri Aug 09, 2013 7:07 pm
by pongpang
เรียน คุณคนควน
ได้ปรับปรุง Code ในส่วนที่ท่านแนะนำ ดังนี้
If ComboBox1.Text <> "" And checkVal > 0 Then
lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
TextBox1.Text = .Index(Alldata, lastRow, 2)
TextBox2.Text = .Index(Alldata, lastRow, 3)
TextBox3.Text = .Index(Alldata, lastRow, 4)
TextBox4.Text = .Index(Alldata, lastRow, 5)
TextBox5.Text = .Index(Alldata, lastRow, 6)
ของเดิม
If checkVal > 0 Then
TextBox1.Text = .Index(Alldata, lastRow, 1)
TextBox2.Text = .Index(Alldata, lastRow, 2)
TextBox3.Text = .Index(Alldata, lastRow, 3)
TextBox4.Text = .Index(Alldata, lastRow, 4)
TextBox5.Text = .Index(Alldata, lastRow, 5)
ผลที่ได้ ดังนี้
1.เมื่อเลือกตัวเลข ที่พิมพ์ไว้แล้ว จะแสดงค่าถูกต้อง
2.ถ้าจะพิมพ์ข้อมูลเพิ่ม(ไม่ตรงกับเลขเก่า)ไม่สามารถพิมพ์ในComboBoxได้เลย
Code: Select all
Private Sub ComboBox1_Change()
Dim Num As Range 'Num:rangename Column
Dim Alldata As Range 'AllData:rangename
Dim lastRow As Integer
Dim checkVal As Long
Set Alldata = ActiveSheet.Range("AllData")
Set Num = ActiveSheet.Range("Num")
With Application
checkVal = .CountIf(Num, ComboBox1.Text)
If ComboBox1.Text <> "" And checkVal > 0 Then
lastRow = .Match(CInt(ComboBox1.Text), Num, 0)
TextBox1.Text = .Index(Alldata, lastRow, 2)
TextBox2.Text = .Index(Alldata, lastRow, 3)
TextBox3.Text = .Index(Alldata, lastRow, 4)
TextBox4.Text = .Index(Alldata, lastRow, 5)
TextBox5.Text = .Index(Alldata, lastRow, 6)
Else
ComboBox1.Text = ""
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
End If
End With
ComboBox1.SetFocus
End Sub
ขอความกรุณาต่อครับ