: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 อื่น

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and 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
Bronze
Bronze
Posts: 441
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 เช่น ปากกา ก็จะได้ข้อมูลปากกามาทั้งหมด) เมื่อได้ข้อมูลเฉพาะที่ต้องการแล้ว พอเลือกดับเบิ้ลคลิกไปแล้ว ข้อมูลที่นำไปวางในชีท จะไม่ตรงกับที่เราเลือก
จะปรับแก้ไขโค๊ดอย่างไรครับ
You do not have the required permissions to view the files attached to this post.
User avatar
puriwutpokin
Guru
Guru
Posts: 3708
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: 3708
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
Bronze
Bronze
Posts: 441
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
Bronze
Bronze
Posts: 441
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

You do not have the required permissions to view the files attached to this post.
User avatar
puriwutpokin
Guru
Guru
Posts: 3708
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
Bronze
Bronze
Posts: 441
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
You do not have the required permissions to view the files attached to this post.
User avatar
puriwutpokin
Guru
Guru
Posts: 3708
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: 30747
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
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
Bronze
Bronze
Posts: 441
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