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()
เป็น

Code: Select all

Private Sub TextBox1_Change()

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 เป็นตัวแปรหรือไม่ และต้องประกาศตัวแปรหรือเปล่า
:D คำเหล่านั้นเป็นตัวแปรทั้งนั้นครับ

ตัวแปรควรจะมีการประกาศเอาไว้ก่อนเสมอ เป็นการจัดสรร Memory ให้เหมาะสมกับประเภทของข้อมูล ทั้งจะได้ติดตาม แก้ไข เปลี่ยนแปลง ได้โดยง่าย การไม่ประกาศตัวแปรจะทำให้ชนิดของข้อมูลนั้น ๆ เป็น Variant ชนิดเดียวซึ่งกิน Memory มากกว่า Type อื่นอีกหลายชนิด หากเขียนเป็นโปรแกรมขนาดใหญ่ นอกจากจะยุ่งยากในการติดตามแก้ไขแล้วจะเกิดปัญหา Memory ไม่พอใช้ขึ้นได้ครับ

Re: มีปัญหาการใช้ form กับ Listฺbox มาจาก Sheet เพื่อค้นหาข้อมูลและส่งข้อมูลไปวางที่ Sheet อื่น

Posted: Mon Nov 27, 2023 10:07 am
by tigerwit
ขอบคุณทั้งสองท่านมากครับ