Page 1 of 1
มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sat Nov 25, 2023 6:05 pm
by tigerwit
จากไฟล์ที่แนบมา
ข้อ 1 ต้องการเรียกข้อมูลพัสดุที่มีอยู่ ในชีท Data ผ่าน Userform1 และ Listbox1 โดยใช้โค๊ด
Code: Select all
Private Sub UserForm_Initialize()
LoadAllData
TextBox1.SetFocus
End Sub
Sub LoadAllData()
LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For ShRow = 1 To LastRow
For ListCol = 2 To 4
Me.ListBox1.AddItem
Me.ListBox1.List(ShRow - 1, ListCol - 2) = Sheet1.Cells(ShRow, ListCol).Value
Next ListCol
Next ShRow
End Sub
ต้องการให้ Listbox1 แสดงข้อมูลที่ดึงมา ตั้งแต่แถวที่ 2 จนถึงแถวสุดท้ายที่มีข้อมูล ส่วนแถวที่ไม่มีข้อมูลไม่ต้องดึงมา
ต้องปรับโค๊ดอย่างไรครับ
ข้อ 2 ต้องการดับเบิ้ลคลิก แถวที่ดึงมาแสดงใน Listbox1 เพื่อส่งข้อมูลในแถวนั้น (ทั้งสามคลอลัมน์)
ไปวางไว้ที่ Sheet Oder ตอนนี้ไปเฉพาะคลอลัมน์แรกเท่านั้น
โค๊ด
Code: Select all
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ActiveCell.Value = ListBox1.Value
' ListBox1.Value = ""
ActiveCell.Offset(1, 0).Select
End Sub
แต่หากใช้ Code นี้
Code: Select all
ActiveCell.Value = Application.Index(Sheets("Data").Range("ColBB"), ListBox1.ListIndex + 1)
ActiveCell.Offset(, 1).Value = Application.Index(Sheets("Data").Range("ColCC"), ListBox1.ListIndex + 1)
ActiveCell.Offset(, 2).Value = Application.Index(Sheets("Data").Range("ColDD"), ListBox1.ListIndex + 1)
ActiveCell.Offset(1, 0).Select
จะสามารถดึงไปวางได้ทั้งสามคลอลัมน์ แต่จะมีปัญหาตอนนี้ มีการค้นข้อมูลจาก Textbox1 (พิมพ์ตัวอักษรบางส่วน แล้ว Enter เช่น ปากกา ก็จะได้ข้อมูลปากกามาทั้งหมด) เมื่อได้ข้อมูลเฉพาะที่ต้องการแล้ว พอเลือกดับเบิ้ลคลิกไปแล้ว ข้อมูลที่นำไปวางในชีท จะไม่ตรงกับที่เราเลือก
จะปรับแก้ไขโค๊ดอย่างไรครับ
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sat Nov 25, 2023 7:37 pm
by puriwutpokin
ตอบข้อ2 นะครับ
ปรับเป็น
Code: Select all
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ActiveCell.Value = ListBox1.List(ListBox1.ListIndex)
ActiveCell.Offset(, 1).Value = ListBox1.List(ListBox1.ListIndex, 1)
ActiveCell.Offset(, 2).Value = ListBox1.List(ListBox1.ListIndex, 2)
ListBox1.Value = ""
ActiveCell.Offset(1, 0).Select
End Sub
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sat Nov 25, 2023 10:48 pm
by puriwutpokin
ตอบข้อ 1
Code: Select all
Sub LoadAllData()
LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For ShRow = 1 To LastRow
' For ListCol = 2 To 4
Me.ListBox1.AddItem
Me.ListBox1.List(ShRow - 1, 0) = Sheet1.Cells(ShRow, 2).Value
Me.ListBox1.List(ShRow - 1, 1) = Sheet1.Cells(ShRow, 3).Value
Me.ListBox1.List(ShRow - 1, 2) = Sheet1.Cells(ShRow, 4).Value
' Next ListCol
Next ShRow
End Sub
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 11:06 am
by tigerwit
ขอบคุณมากครับผม
พอดีว่าได้ไฟล์ตัวอย่างมาจากช่องยูทูปของอินเดียเลยเอามาแกะโค๊ด เพื่อเอาไปประยุกต์ทำงานให้โรงเรียน
แต่ผมยังไม่เข้าใจอะไรมากนัก
พอดียังมีข้อสงสัยอยู่ว่า
โค๊ดพวกนี้
Code: Select all
Sub LoadAllData()
LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For ShRow = 1 To LastRow
' For ListCol = 2 To 4
Me.ListBox1.AddItem
Me.ListBox1.List(ShRow - 1, 0) = Sheet1.Cells(ShRow, 2).Value
Me.ListBox1.List(ShRow - 1, 1) = Sheet1.Cells(ShRow, 3).Value
Me.ListBox1.List(ShRow - 1, 2) = Sheet1.Cells(ShRow, 4).Value
' Next ListCol
Next ShRow
End Sub
[code]
หรือ
[code]
Private Sub TextBox1_AfterUpdate()
' 'Add Column headers
' With Me.ListBox1
' .Clear
' For ColHead = 2 To 4
' .AddItem
' .List(0, ColHead - 2) = Sheet1.Cells(1, ColHead).Value
' Next ColHead
' ListRow = 1
' If IsDate(Me.TextBox1) Then
' FindVal = CDate(Me.TextBox1)
' ElseIf IsNumeric(Me.TextBox1) Then FindVal = Val(Me.TextBox1)
' Else
' FindVal = "*" & Me.TextBox1 & "*"
' End If
' LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
' For ShRow = 2 To LastRow
' FindRow = Application.WorksheetFunction.CountIf(Sheet1.Rows(ShRow).EntireRow, FindVal)
' If FindRow > 0 Then
' For ListCol = 2 To 4
' .AddItem
' .List(ListRow, ListCol - 2) = Sheet1.Cells(ShRow, ListCol).Value
' Next ListCol
' ListRow = ListRow + 1
' End If
' Next ShRow
' End With
End Sub
พวกที่เป็น LastRow ShRow ListRow FindRow หรือ ColHead เป็นตัวแปรหรือไม่ และต้องประกาศตัวแปรหรือเปล่า
เพราะเท่าที่เห็นในไฟล์ ไม่มีการประกาศตัวแปร
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 11:46 am
by tigerwit
รบกวนอีกคำถามครับ
จากไฟล์ที่แนบมา จะปรับโค๊ดอย่างไรให้ค้นหาข้อมูลได้
Code: Select all
Private Sub TextBox1_Change()
' 'Add Column headers
With Me.ListBox1
.Clear
For ColHead = 2 To 4
.AddItem
.List(0, ColHead - 2) = Sheet1.Cells(1, ColHead).Value
Next ColHead
ListRow = 1
If IsDate(Me.TextBox1) Then
FindVal = CDate(Me.TextBox1)
ElseIf IsNumeric(Me.TextBox1) Then FindVal = Val(Me.TextBox1)
Else
FindVal = "*" & Me.TextBox1 & "*"
End If
LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For ShRow = 2 To LastRow
FindRow = Application.WorksheetFunction.CountIf(Sheet1.Rows(ShRow).EntireRow, FindVal)
If FindRow > 0 Then
For ListCol = 2 To 4
.AddItem
.List(ListRow, ListCol - 2) = Sheet1.Cells(ShRow, ListCol).Value
Next ListCol
ListRow = ListRow + 1
End If
Next ShRow
End With
End Sub
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 2:03 pm
by puriwutpokin
เปลี่ยนจาก
Code: Select all
Private Sub TextBox1_AfterUpdate()
เป็น
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 2:26 pm
by tigerwit
จากไฟล์ที่แนบมา
ลองตามคำแนะนำแล้วไม่แสดงผลครับ
ถ้าเป็นไฟล์แรกที่สอบถามจะได้เพราะที่ชีท Data จะเริ่มต้น ที่ คลอลัมน์ A
แต่ไฟล์ที่แนบมานี้ข้อมูลจะเริ่มต้นที่ คลอลัมน์ B
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 2:39 pm
by puriwutpokin
ปรับตามนี้ครับ
Code: Select all
Private Sub TextBox1_Change()
' 'Add Column headers
With Me.ListBox1
.Clear
For ColHead = 3 To 5
.AddItem
.List(0, ColHead - 2) = Sheet1.Cells(1, ColHead).Value
Next ColHead
ListRow = 1
If IsDate(Me.TextBox1) Then
FindVal = CDate(Me.TextBox1)
ElseIf IsNumeric(Me.TextBox1) Then FindVal = Val(Me.TextBox1)
Else
FindVal = "*" & Me.TextBox1 & "*"
End If
LastRow = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
For ShRow = 3 To LastRow
FindRow = Application.WorksheetFunction.CountIf(Sheet1.Rows(ShRow).EntireRow, FindVal)
If FindRow > 0 Then
For ListCol = 3 To 5
.AddItem
.List(ListRow, ListCol - 3) = Sheet1.Cells(ShRow, ListCol).Value
Next ListCol
ListRow = ListRow + 1
End If
Next ShRow
End With
End Sub
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Sun Nov 26, 2023 4:43 pm
by snasui
tigerwit wrote: Sun Nov 26, 2023 11:06 am
พวกที่เป็น LastRow ShRow ListRow FindRow หรือ ColHead เป็นตัวแปรหรือไม่ และต้องประกาศตัวแปรหรือเปล่า

คำเหล่านั้นเป็นตัวแปรทั้งนั้นครับ
ตัวแปรควรจะมีการประกาศเอาไว้ก่อนเสมอ เป็นการจัดสรร Memory ให้เหมาะสมกับประเภทของข้อมูล ทั้งจะได้ติดตาม แก้ไข เปลี่ยนแปลง ได้โดยง่าย การไม่ประกาศตัวแปรจะทำให้ชนิดของข้อมูลนั้น ๆ เป็น Variant ชนิดเดียวซึ่งกิน Memory มากกว่า Type อื่นอีกหลายชนิด หากเขียนเป็นโปรแกรมขนาดใหญ่ นอกจากจะยุ่งยากในการติดตามแก้ไขแล้วจะเกิดปัญหา Memory ไม่พอใช้ขึ้นได้ครับ
Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น
Posted: Mon Nov 27, 2023 10:07 am
by tigerwit
ขอบคุณทั้งสองท่านมากครับ