:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

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

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
User avatar
tigerwit
Silver
Silver
Posts: 555
Joined: Wed Mar 31, 2010 10:51 pm
Location: สกลนคร
Excel Ver: 2019
Contact:

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

#1

Post 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 เช่น ปากกา ก็จะได้ข้อมูลปากกามาทั้งหมด) เมื่อได้ข้อมูลเฉพาะที่ต้องการแล้ว พอเลือกดับเบิ้ลคลิกไปแล้ว ข้อมูลที่นำไปวางในชีท จะไม่ตรงกับที่เราเลือก
จะปรับแก้ไขโค๊ดอย่างไรครับ
Attachments
FormS.xlsb
(45.92 KiB) Downloaded 2 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#2

Post 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
:shock: :roll: :D
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#3

Post 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
:shock: :roll: :D
User avatar
tigerwit
Silver
Silver
Posts: 555
Joined: Wed Mar 31, 2010 10:51 pm
Location: สกลนคร
Excel Ver: 2019
Contact:

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

#4

Post 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 เป็นตัวแปรหรือไม่ และต้องประกาศตัวแปรหรือเปล่า
เพราะเท่าที่เห็นในไฟล์ ไม่มีการประกาศตัวแปร
User avatar
tigerwit
Silver
Silver
Posts: 555
Joined: Wed Mar 31, 2010 10:51 pm
Location: สกลนคร
Excel Ver: 2019
Contact:

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

#5

Post 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

Attachments
FormS2.xlsb
(51.83 KiB) Downloaded 1 time
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#6

Post by puriwutpokin »

เปลี่ยนจาก

Code: Select all

Private Sub TextBox1_AfterUpdate()
เป็น

Code: Select all

Private Sub TextBox1_Change()
:shock: :roll: :D
User avatar
tigerwit
Silver
Silver
Posts: 555
Joined: Wed Mar 31, 2010 10:51 pm
Location: สกลนคร
Excel Ver: 2019
Contact:

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

#7

Post by tigerwit »

จากไฟล์ที่แนบมา
ลองตามคำแนะนำแล้วไม่แสดงผลครับ
ถ้าเป็นไฟล์แรกที่สอบถามจะได้เพราะที่ชีท Data จะเริ่มต้น ที่ คลอลัมน์ A
แต่ไฟล์ที่แนบมานี้ข้อมูลจะเริ่มต้นที่ คลอลัมน์ B
Attachments
FormS2.xlsb
(52.14 KiB) Downloaded 2 times
User avatar
puriwutpokin
Guru
Guru
Posts: 3801
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#8

Post 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
:shock: :roll: :D
User avatar
snasui
Site Admin
Site Admin
Posts: 31190
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#9

Post by snasui »

tigerwit wrote: Sun Nov 26, 2023 11:06 am พวกที่เป็น LastRow ShRow ListRow FindRow หรือ ColHead เป็นตัวแปรหรือไม่ และต้องประกาศตัวแปรหรือเปล่า
:D คำเหล่านั้นเป็นตัวแปรทั้งนั้นครับ

ตัวแปรควรจะมีการประกาศเอาไว้ก่อนเสมอ เป็นการจัดสรร Memory ให้เหมาะสมกับประเภทของข้อมูล ทั้งจะได้ติดตาม แก้ไข เปลี่ยนแปลง ได้โดยง่าย การไม่ประกาศตัวแปรจะทำให้ชนิดของข้อมูลนั้น ๆ เป็น Variant ชนิดเดียวซึ่งกิน Memory มากกว่า Type อื่นอีกหลายชนิด หากเขียนเป็นโปรแกรมขนาดใหญ่ นอกจากจะยุ่งยากในการติดตามแก้ไขแล้วจะเกิดปัญหา Memory ไม่พอใช้ขึ้นได้ครับ
User avatar
tigerwit
Silver
Silver
Posts: 555
Joined: Wed Mar 31, 2010 10:51 pm
Location: สกลนคร
Excel Ver: 2019
Contact:

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

#10

Post by tigerwit »

ขอบคุณทั้งสองท่านมากครับ
Post Reply