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
:D 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
:D ลองดูตัวอย่างตามด้านล่างครับ

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
:D ให้ลบ Application.IndexApplication.WorksheetFunction.Index ทิ้งไปหรือ Mark เป็น Comment

สำหรับ Name ใน Code ที่เขียนมาหมายถึงอะไร กำหนดค่าให้กับตัวแปรเป็นช่วงข้อมูลใดครับ :?:

Re: ต้องการให้ข้อมูลแสดงใน User Form ครับ

Posted: Tue Aug 06, 2013 8:47 pm
by pongpang
snasui wrote::D ให้ลบ 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
:D เมื่อเป็น 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
:shock: บรรทัดใดที่ผมแนะนำว่าให้ลบไปหรือ 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
:D ลองดูตัวอย่างการปรับ 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
:D ทั้งหมดนั้นเป็นการประกาศตัวแปรครับ

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
:D ลองปรับบรรทัดที่มีปัญหาเป็นตามนี้ครับ 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::D ลองปรับบรรทัดที่มีปัญหาเป็นตามนี้ครับ 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
:D ลองปรับ 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
ขอความกรุณาต่อครับ