: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

Advanced search with vba show on Lisbox

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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่

Post a reply


This question is a means of preventing automated form submissions by spambots.
Smilies
:D :thup: :cp: :flw: :rz: :sg: :tt: :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :ard: :arl: :aru: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Advanced search with vba show on Lisbox

Re: Advanced search with vba show on Lisbox

#16

by Totem » Mon Jun 29, 2020 1:29 pm

snasui wrote: Mon Jun 29, 2020 12:12 pm
Totem wrote: Sun Jun 28, 2020 10:03 pm ไม่รู้ว่าค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch
โดยเหมือนกับ MyAdvancedSearch ก็ทำได้ใช่ไหมครับ
:D ทำได้อย่างแน่นอน Code แบบ MyAdvancedSearch จะเขียนไว้ตรงไหนก็ย่อมได้ครับ

ลองดูว่า MyAdvancedSearch เขียนไว้อย่างไรก็ให้เขียนด้วยตรรกะเดียวกันครับ
:D จะลองทำดูครับ ขอบคุณครับอาจารย์

Re: Advanced search with vba show on Lisbox

#15

by snasui » Mon Jun 29, 2020 12:12 pm

Totem wrote: Sun Jun 28, 2020 10:03 pm ไม่รู้ว่าค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch
โดยเหมือนกับ MyAdvancedSearch ก็ทำได้ใช่ไหมครับ
:D ทำได้อย่างแน่นอน Code แบบ MyAdvancedSearch จะเขียนไว้ตรงไหนก็ย่อมได้ครับ

ลองดูว่า MyAdvancedSearch เขียนไว้อย่างไรก็ให้เขียนด้วยตรรกะเดียวกันครับ

Re: Advanced search with vba show on Lisbox

#14

by Totem » Sun Jun 28, 2020 10:03 pm

snasui wrote: Sun Jun 28, 2020 3:44 pm :D ปรับ Code ให้ค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch ตามด้านล่างครับ

Code: Select all

Private Sub CommandButton6_Click()              'search
    
    Dim c As Range, x As String, i As Integer
    Application.Calculation = xlCalculationManual
    
    If colSelect = 2 Then
        x = "B"
    Else
        x = "D"
    End If
    With Sheets("add")
        If Me.TextBox1.Value = "" Then Exit Sub
        If Me.ListBox2.RowSource <> "" Then
            Me.ListBox2.RowSource = ""
        End If
        
        Me.ListBox2.Clear
        
        i = 0
        For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
            If c.Value = Me.TextBox1.Text Then
                Me.ListBox2.AddItem
                Me.ListBox2.List(i, 0) = c.Value
                Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
                i = i + 1
            End If
        Next c
    End With
    
    Application.Calculation = xlCalculationAutomatic

End Sub
:D ปรับ Code ให้ค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch
เป็นการค้นหาที่ใส่รายการต้องให้ตรงตามข้อมูลที่มี หากเทียบกับ MyAdvancedSearch จะค้นหาได้ละเอียดกว่าครับเพราะค้นคำใกล้เคียงด้วยแสดงทั้งหมดออกมา ผมชอบวิธีค้นหา MyAdvancedSearch มากกว่า ไม่รู้ว่าค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch
โดยเหมือนกับ MyAdvancedSearch ก็ทำได้ใช่ไหมครับ ขอถามเป็นแนวทางครับ ขอบคุณครับ

Re: Advanced search with vba show on Lisbox

#13

by Totem » Sun Jun 28, 2020 9:38 pm

snasui wrote: Sun Jun 28, 2020 7:22 pm :D เพิ่มการประกาศตัวแปร Array ด้านบนเป็น Dim a(99, 0 To 10) As Variant

จากนั้นปรับการ Loop เป็นด้านล่างครับ

Code: Select all

'Other code
    i = 0
    For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
        If c.Value = Me.TextBox1.Text Then
            a(i, 0) = c.Value
            a(i, 1) = c.Offset(0, 1).Value
            a(i, 2) = c.Offset(0, 2).Value
            a(i, 3) = c.Offset(0, 3).Value
            a(i, 4) = c.Offset(0, 4).Value
            a(i, 5) = c.Offset(0, 5).Value
            a(i, 6) = c.Offset(0, 7).Value
            a(i, 8) = c.Offset(0, 8).Value
            a(i, 9) = c.Offset(0, 9).Value
            a(i, 10) = c.Offset(0, 10).Value
            i = i + 1
        End If
    Next c
    Me.ListBox2.ColumnCount = 11
    Me.ListBox2.List = a
End With
'Other code
:D :?: :idea: ตอนแรกคิดไม่ออก พอเห็นตัวอย่างที่อาจารย์ให้มาเข้าใจเลยครับ นำไปปรับใช้ ได้ตามต้องการครับ ขอบคุณครับ

Re: Advanced search with vba show on Lisbox

#12

by snasui » Sun Jun 28, 2020 7:22 pm

:D เพิ่มการประกาศตัวแปร Array ด้านบนเป็น Dim a(99, 0 To 10) As Variant

จากนั้นปรับการ Loop เป็นด้านล่างครับ

Code: Select all

'Other code
    i = 0
    For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
        If c.Value = Me.TextBox1.Text Then
            a(i, 0) = c.Value
            a(i, 1) = c.Offset(0, 1).Value
            a(i, 2) = c.Offset(0, 2).Value
            a(i, 3) = c.Offset(0, 3).Value
            a(i, 4) = c.Offset(0, 4).Value
            a(i, 5) = c.Offset(0, 5).Value
            a(i, 6) = c.Offset(0, 7).Value
            a(i, 8) = c.Offset(0, 8).Value
            a(i, 9) = c.Offset(0, 9).Value
            a(i, 10) = c.Offset(0, 10).Value
            i = i + 1
        End If
    Next c
    Me.ListBox2.ColumnCount = 11
    Me.ListBox2.List = a
End With
'Other code

Re: Advanced search with vba show on Lisbox

#11

by Totem » Sun Jun 28, 2020 5:38 pm

snasui wrote: Sun Jun 28, 2020 3:44 pm :D ปรับ Code ให้ค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch ตามด้านล่างครับ

Code: Select all

Private Sub CommandButton6_Click()              'search
    
    Dim c As Range, x As String, i As Integer
    Application.Calculation = xlCalculationManual
    
    If colSelect = 2 Then
        x = "B"
    Else
        x = "D"
    End If
    With Sheets("add")
        If Me.TextBox1.Value = "" Then Exit Sub
        If Me.ListBox2.RowSource <> "" Then
            Me.ListBox2.RowSource = ""
        End If
        
        Me.ListBox2.Clear
        
        i = 0
        For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
            If c.Value = Me.TextBox1.Text Then
                Me.ListB[code]
ox2.AddItem
Me.ListBox2.List(i, 0) = c.Value
Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
i = i + 1
End If
Next c
End With

Application.Calculation = xlCalculationAutomatic

End Sub[/code]
:D ปรับ code แล้วครับ ข้อ2.ได้ตามต้องการครับ ขอบคุณครับอาจารย์
ในข้อ 3.ปัญหาการกำหนด Me.ListBox2.AddItem ให้แสดงใน Listbox2 เกินกว่า 10 column ไม่ได้ run time error 380 could not set the list property invalid property value
ขออธิบายดังนี้
1.เมือนำ code ข้อ 2 มาใช้ในกรณีที่ต้องการนำไปประยุกต์ใช้ให้ Listbox 2 แสดงรายการให้มี column มีขึ้นจากเดิม 2 column
หากกำหนด

Code: Select all

Me.ListBox2.AddItem
ไปจนถึง

Code: Select all

Me.ListBox2.List(i, 9) = c.Offset(0, 9).Value
แสดงรายการได้ครบทุก column
2.เมื่อเพิ่ม

Code: Select all

Me.ListBox2.List(i, 10) = c.Offset(0, 10).Value
เป็นต้นไป
run time error 380 could not set the list property invalid property value ติดตรงนี้
ช่วยปรับ code ตรงนี้ครับ

Code: Select all

                Me.ListBox2.AddItem
                Me.ListBox2.List(i, 0) = c.Value
                Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
                Me.ListBox2.List(i, 2) = c.Offset(0, 2).Value
                Me.ListBox2.List(i, 3) = c.Offset(0, 3).Value
                Me.ListBox2.List(i, 4) = c.Offset(0, 4).Value
                Me.ListBox2.List(i, 5) = c.Offset(0, 5).Value
                Me.ListBox2.List(i, 6) = c.Offset(0, 7).Value
                Me.ListBox2.List(i, 8) = c.Offset(0, 8).Value
                Me.ListBox2.List(i, 9) = c.Offset(0, 9).Value
                Me.ListBox2.List(i, 10) = c.Offset(0, 10).Value

Code: Select all

Private Sub CommandButton6_Click()              'search
    
    Dim c As Range, x As String, i As Integer
    Application.Calculation = xlCalculationManual
    
    If colSelect = 2 Then
        x = "B"
    Else
        x = "D"
    End If
    With Sheets("add")
        If Me.TextBox1.Value = "" Then Exit Sub
        If Me.ListBox2.RowSource <> "" Then
            Me.ListBox2.RowSource = ""
        End If
        
        Me.ListBox2.Clear
        
        i = 0
        For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
            If c.Value = Me.TextBox1.Text Then
                Me.ListBox2.AddItem
                Me.ListBox2.List(i, 0) = c.Value
                Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
                Me.ListBox2.List(i, 2) = c.Offset(0, 2).Value
                Me.ListBox2.List(i, 3) = c.Offset(0, 3).Value
                Me.ListBox2.List(i, 4) = c.Offset(0, 4).Value
                Me.ListBox2.List(i, 5) = c.Offset(0, 5).Value
                Me.ListBox2.List(i, 6) = c.Offset(0, 7).Value
                Me.ListBox2.List(i, 8) = c.Offset(0, 8).Value
                Me.ListBox2.List(i, 9) = c.Offset(0, 9).Value
                Me.ListBox2.List(i, 10) = c.Offset(0, 10).Value
                i = i + 1
            End If
        Next c
    End With
    
    Application.Calculation = xlCalculationAutomatic

End Sub

ขอบคุณครับ

add and select.xlsm
(30.79 KiB) Downloaded 21 times

Re: Advanced search with vba show on Lisbox

#10

by snasui » Sun Jun 28, 2020 3:44 pm

:D ปรับ Code ให้ค้นหาข้อมูลได้โดยตรงไม่ต้องพึ่งพาฟังก์ชั่น MyAdvancedSearch ตามด้านล่างครับ

Code: Select all

Private Sub CommandButton6_Click()              'search
    
    Dim c As Range, x As String, i As Integer
    Application.Calculation = xlCalculationManual
    
    If colSelect = 2 Then
        x = "B"
    Else
        x = "D"
    End If
    With Sheets("add")
        If Me.TextBox1.Value = "" Then Exit Sub
        If Me.ListBox2.RowSource <> "" Then
            Me.ListBox2.RowSource = ""
        End If
        
        Me.ListBox2.Clear
        
        i = 0
        For Each c In .Range(x & 2, .Range(x & .Rows.Count).End(xlUp))
            If c.Value = Me.TextBox1.Text Then
                Me.ListBox2.AddItem
                Me.ListBox2.List(i, 0) = c.Value
                Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
                i = i + 1
            End If
        Next c
    End With
    
    Application.Calculation = xlCalculationAutomatic

End Sub

Re: Advanced search with vba show on Lisbox

#9

by Totem » Sun Jun 28, 2020 2:20 pm

snasui wrote: Tue Jun 23, 2020 8:41 pm
Totem wrote: Tue Jun 23, 2020 2:46 pm 3.ข้อความหรือตัวเลขที่พิมพ์ลงไปจะไปอยู่ที่ ช่อง A1 MyAdvancedSearch() ก็จะค้นหารายการมาให้ เช่น เลือก BBB2 ใน sheet add ก็จะแสดงรายการ ชื่อ1 BBB2 แผนก1 bbb2
คือ Listbox แสดงรายการเหมือน sheet add column B , C ออกมา
ก็จะได้รายการที่ต้องการ
2.หากเปลี่ยนไปเลือกรายการใน ชื่อ แผนก 2 ก็ทำการกดปุ่ม ชื่อ แผนก 2
เมื่อแสดงรายการออกมาแล้ว เช่น ต้องการค้นหา ddddd เมือกดปุ่มค้นหา
ใน sheet add แสดงรายการ ชื่อ2 ddddd แผนก2 weeefdd5
คือ Listbox แสดงรายการเหมือน sheet add column D , E ออกมา
:D ทั้งหมดที่กล่าวไม่สอดคล้องกับการทำงานของฟังก์ชั่น MyAdvancedSearch ครับ

ทั้งนี้เนื่องจาก MyAdvancedSearch นำค่าจาก TextBox1 ไปค้นหาจากคอลัมน์ B คอลัมน์เดียวเท่านั้น

จึงต้องปรับ Statement นี้ For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp)) ใน MyAdvancedSearch ให้สอดคล้องกับคอลัมน์ที่ต้องการค้นหาเสียก่อน เมื่อผ่านจุดนี้ไปได้แล้วติดตรงไหนค่อยนำมาถามกันต่อครับ
:D เรียนอาจารย์ ผมปรับ code ใน MyAdvancedSearch
โดยการกำหนดให้ใส่ข้อมูลรายการ เป็น 2 ช่อง ใน A1 กับ F1 แยกการค้นหาได้แล้ว

Code: Select all

Sub MyAdvancedSearch()        'Worksheet_Change(ByVal Target As Range)
    Dim r, i As Range, v, u As String, s, a As String
    
        Application.Calculation = xlCalculationManual
        
    With Sheets("add")
    
                .Range("A1,F1").CurrentRegion.EntireRow.Hidden = False
                If Range("A1") <> "" Then
                    s = LCase(.Range("A1").Value)
                        For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp))
                            v = ""
                            v = v & r.Value
                            v = v & r.Offset(0, 1).Value
                        If Not v Like "*" & s & "*" Then
                                r.EntireRow.Hidden = True
                End If
            Next r
        End If
                If Range("F1") <> "" Then
                     a = LCase(.Range("F1").Value)
                        For Each i In .Range("D2", .Range("D" & .Rows.Count).End(xlUp))
                            u = ""
                            u = u & i.Value
                            u = u & i.Offset(0, 1).Value
                            u = LCase(u)
                        If Not u Like "*" & a & "*" Then
                             i.EntireRow.Hidden = True
                         End If
                     Next i
                End If
    End With
End Sub
และขออธิบายต่อใน userform ดังนี้
1. เมื่อกำหนด Listbox2 เลือกชื่อและแผนก 1 หรือ 2 ได้ตามต้องการ
ถ้าเลือกชื่อและแผนก 1 แล้วกดปุ่นค้นหาจะไปว่าข้อมูลลงใน A1 ค้นหาได้
ถ้าเลือกชื่อและแผนก 2 แล้วกดปุ่นค้นหาจะไปว่าข้อมูลลงใน F1 ค้นหาได้
ตามต้องการ

Code: Select all

Private Sub CommandButton6_Click()              'search

   Dim LastRow&, c, x  As Range, i, y   As Variant
   
       Application.Calculation = xlCalculationManual
   
               Sheets("add").Range("A1").ClearContents
               Sheets("add").Range("F1").ClearContents
               If colSelect = 2 Then
               Sheets("add").Range("A1").Value = TextBox1.Value
               End If
                If colSelect = 4 Then
               Sheets("add").Range("F1").Value = TextBox1.Value
               End If
            '    Me.ListBox2.Clear
            
        With Sheets("add")
                   LastRow = Range("B" & Rows.Count).End(xlUp).Row
                   If Me.ListBox2.RowSource <> "" Then
                       Me.ListBox2.RowSource = ""
                   End If
                   
                   Me.ListBox2.Clear

            If Range("A1") <> "" Then
                   i = 0
                   For Each c In .Range("B2", Range("B2").End(xlDown)).cells.SpecialCells(xlCellTypeVisible)
                        Me.ListBox2.AddItem
                        Me.ListBox2.List(i, 0) = c.Value
                        Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
                          i = i + 1
                Next c
            End If
            If Range("F1") <> "" Then
                    y = 0
                   For Each x In .Range("D2", Range("D2").End(xlDown)).cells.Rows.SpecialCells(xlCellTypeVisible)
                        Me.ListBox2.AddItem
                        Me.ListBox2.List(y, 0) = x.Value
                        Me.ListBox2.List(y, 1) = x.Offset(0, 1).Value
                        y = y + 1
                Next x
            End If
        End With
        
        Application.Calculation = xlCalculationAutomatic
            
End Sub
2.แล้วนำมาแสดงรายการแยกกันได้ใน Listbox2 ว่าเลือกชื่อและแผนก 1 หรือ 2 ที่ได้ค้นหาเสร็จเรียบร้อยแล้ว แต่มีปัญหากับบรรทัดนี้ครับ

Code: Select all

                   For Each c In .Range("B2", Range("B2").End(xlDown)).cells.SpecialCells(xlCellTypeVisible)
และ

Code: Select all

                   For Each x In .Range("D2", Range("D2").End(xlDown)).cells.Rows.SpecialCells(xlCellTypeVisible)
คือเลือกเฉพาะ cells B2 , D2 ลงมาจนสุดบรรทัดสุดท้าย เข้าไปกด F5 run ที่ลงขั้นตอน ทำได้ตามต้องการครับ

แต่พอ Loop ในหน้า userform แล้วมันนานค้างครับ ตามที่เข้าใจไป Loop ใน .End(xlDown)).cells ที่ไม่ใช่มาด้วย
ผมลองเปลี่ยนเป็น

Code: Select all

                   For Each c In .Range("B2", Range("B2").End(xlUp)).cells.SpecialCells(xlCellTypeVisible)
เลือกได้ตรงListbox2ที่ต้องการ มีแต่หัวชื่อ แผนก เท่านั้น ครับ ติดตรงนี้ครับ

3.ปัญหาการกำหนด Me.ListBox2.AddItem ให้แสดงใน Listbox2 เกินกว่า 10 column ไม่ได้ run time error 380 could not set the list property invalid property value ขอเกริ่นไว้ก่อนในช้อนี้ หากผมแก้ปัญหาข้อ 2 ได้ครับ


ขอบคุณครับ
Attachments
add and select.xlsm
(41.62 KiB) Downloaded 11 times

Re: Advanced search with vba show on Lisbox

#8

by snasui » Tue Jun 23, 2020 8:41 pm

Totem wrote: Tue Jun 23, 2020 2:46 pm 3.ข้อความหรือตัวเลขที่พิมพ์ลงไปจะไปอยู่ที่ ช่อง A1 MyAdvancedSearch() ก็จะค้นหารายการมาให้ เช่น เลือก BBB2 ใน sheet add ก็จะแสดงรายการ ชื่อ1 BBB2 แผนก1 bbb2
คือ Listbox แสดงรายการเหมือน sheet add column B , C ออกมา
ก็จะได้รายการที่ต้องการ
2.หากเปลี่ยนไปเลือกรายการใน ชื่อ แผนก 2 ก็ทำการกดปุ่ม ชื่อ แผนก 2
เมื่อแสดงรายการออกมาแล้ว เช่น ต้องการค้นหา ddddd เมือกดปุ่มค้นหา
ใน sheet add แสดงรายการ ชื่อ2 ddddd แผนก2 weeefdd5
คือ Listbox แสดงรายการเหมือน sheet add column D , E ออกมา
:D ทั้งหมดที่กล่าวไม่สอดคล้องกับการทำงานของฟังก์ชั่น MyAdvancedSearch ครับ

ทั้งนี้เนื่องจาก MyAdvancedSearch นำค่าจาก TextBox1 ไปค้นหาจากคอลัมน์ B คอลัมน์เดียวเท่านั้น

จึงต้องปรับ Statement นี้ For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp)) ใน MyAdvancedSearch ให้สอดคล้องกับคอลัมน์ที่ต้องการค้นหาเสียก่อน เมื่อผ่านจุดนี้ไปได้แล้วติดตรงไหนค่อยนำมาถามกันต่อครับ

Re: Advanced search with vba show on Lisbox

#7

by Totem » Tue Jun 23, 2020 2:46 pm

snasui wrote: Mon Jun 22, 2020 8:35 pm :D ค่อย ๆ ถามตอบกันไปครับ

ฟังก์ชั่น MyAdvanceSearch ทำงานสัมพันธ์กับ TextBox1 เมื่อคลิกปุ่ม Search อย่างไร

ยกตัวอย่างเช่นคีย์ AAA ลงใน TextBox1 แล้วคลิกปุ่ม Search

กรุณาอธิบายมาเป็นขั้นเป็นตอน เช่นก่อนคีย์ค่าใน TextBox1 คลิกปุ่มไหน อย่างไร เมื่อคลิกปุ่ม Search แล้วผลที่ต้องการคืออะไร ได้ตรงตามที่ต้องการแล้วหรือไม่ ผมอ่านที่บรรยายมายังมีความคลุมเครือครับ

กรุณาถามตอบให้ผ่านไปทีละขั้น ขั้นไหนที่ติดอยู่ให้ถามขั้นนั้นให้ผ่านไปก่อนครับ
:D ขั้นตอนเป็นดังนี้
1.เมื่อเปิด userform ขึ้นมาแล้ว ทำการเลือกรายการชื่อ แผนก 1 หรือ ชื่อ แผนก 2 ตามความต้องการ เช่น กดปุ่มเลือกรายการชื่อ แผนก 1 จะแสดงราการขึ้นมาใน Listbox2 ทางขวา
2.จากนั้นเมื่อต้องการ ค้นหารายการ ชื่อ แผนก 1 ใน Listbox2 จึงทำการพิมพ์ข้อความหรือตัวเลข ฯ ลงใน Textbox1 แล้ว กดปุ่มค้นหา
3.ข้อความหรือตัวเลขที่พิมพ์ลงไปจะไปอยู่ที่ ช่อง A1 MyAdvancedSearch() ก็จะค้นหารายการมาให้ เช่น เลือก BBB2 ใน sheet add ก็จะแสดงรายการ ชื่อ1 BBB2 แผนก1 bbb2
คือ Listbox แสดงรายการเหมือน sheet add column B , C ออกมา
ก็จะได้รายการที่ต้องการ
2.หากเปลี่ยนไปเลือกรายการใน ชื่อ แผนก 2 ก็ทำการกดปุ่ม ชื่อ แผนก 2
เมื่อแสดงรายการออกมาแล้ว เช่น ต้องการค้นหา ddddd เมือกดปุ่มค้นหา
ใน sheet add แสดงรายการ ชื่อ2 ddddd แผนก2 weeefdd5
คือ Listbox แสดงรายการเหมือน sheet add column D , E ออกมา
ก็จะได้รายการที่ต้องการ
ดังนั้นจาก code จึงมีปัญหาว่า

Code: Select all

Private Sub CommandButton6_Click()              'search

   Dim LastRow&, c, v As Range, i, p As Integer
   
               Sheets("add").Range("A1").ClearContents
               Sheets("add").Range("A1").Value = TextBox1.Value
               
            '    Me.ListBox2.Clear
               With Sheets("add")
                   LastRow = Range("B" & Rows.Count).End(xlUp).Row
                   If Me.ListBox2.RowSource <> "" Then
                       Me.ListBox2.RowSource = ""
                   End If
                   
                   Me.ListBox2.Clear
                   Me.ListBox2.ColumnCount = colSelect
                   
                   i = colSelect
                   For Each c In .Range("B2:B" & LastRow).SpecialCells(xlCellTypeVisible)

                        Me.ListBox2.AddItem
                        Me.ListBox2.List(i - colSelect, 0) = c(1, colSelect - 1).Value
                        Me.ListBox2.List(i - colSelect, 1) = c(1, colSelect - 1).Value
                        
                       i = i + 1
                   Next
                                    
               End With

End Sub
กำหนดให้โปรแกรมทราบตำแหน่งของ column แล้ว

Code: Select all

                   Me.ListBox2.ColumnCount = colSelect
                   
                   i = colSelect
ทำการ AddItem

Code: Select all

                      Me.ListBox2.List(i - colSelect, 0) = c(1, colSelect - 1).Value
                        Me.ListBox2.List(i - colSelect, 1) = c(1, colSelect - 1).Value
แต่กำหนดตำแหน่งให้ตรงตามความต้องการยังไม่ได้ครับ

ไฟล์ตามรายการข้างบนครับ

ขอบคุณครับ

Re: Advanced search with vba show on Lisbox

#6

by snasui » Mon Jun 22, 2020 8:35 pm

:D ค่อย ๆ ถามตอบกันไปครับ

ฟังก์ชั่น MyAdvanceSearch ทำงานสัมพันธ์กับ TextBox1 เมื่อคลิกปุ่ม Search อย่างไร

ยกตัวอย่างเช่นคีย์ AAA ลงใน TextBox1 แล้วคลิกปุ่ม Search

กรุณาอธิบายมาเป็นขั้นเป็นตอน เช่นก่อนคีย์ค่าใน TextBox1 คลิกปุ่มไหน อย่างไร เมื่อคลิกปุ่ม Search แล้วผลที่ต้องการคืออะไร ได้ตรงตามที่ต้องการแล้วหรือไม่ ผมอ่านที่บรรยายมายังมีความคลุมเครือครับ

กรุณาถามตอบให้ผ่านไปทีละขั้น ขั้นไหนที่ติดอยู่ให้ถามขั้นนั้นให้ผ่านไปก่อนครับ

Re: Advanced search with vba show on Lisbox

#5

by Totem » Mon Jun 22, 2020 6:49 pm

snasui wrote: Sun Jun 21, 2020 6:18 pm
Totem wrote: Sun Jun 21, 2020 5:39 pm แต่ ถ้าไปเลือกชื่อ2 แผนก2 ก็จะค้นหาไม่ได้ เพราะไม่ได้...
:D ต้องปรับให้โปรแกรมรู้ว่าต้องการจะค้นจากตำแหน่งไหน ผมได้เขียนเป็นตัวอย่างการสร้างตัวแปรเอาไว้ให้แล้วใน Post ก่อน ๆ ควรจะนำมาประยุกต์กับงานนี้ครับ
:D ครับ ได้ลองปรับแล้วครับ
สามารถเลือกได้ว่าจะเลือกจะเลือกแผนก1 หรือ แผนก2 ได้แล้ว แต่ยังอยู่ในแถวเดียวกันครับ

Code: Select all

Private Sub CommandButton6_Click()              'search

   Dim LastRow&, c, v As Range, i, p As Integer
   
               Sheets("add").Range("A1").ClearContents
               Sheets("add").Range("A1").Value = TextBox1.Value
               
            '    Me.ListBox2.Clear
               With Sheets("add")
                   LastRow = Range("B" & Rows.Count).End(xlUp).Row
                   If Me.ListBox2.RowSource <> "" Then
                       Me.ListBox2.RowSource = ""
                   End If
                   
                   Me.ListBox2.Clear
                   Me.ListBox2.ColumnCount = colSelect
                   
                   i = colSelect
                   For Each c In .Range("B2:E" & LastRow).SpecialCells(xlCellTypeVisible)

                        Me.ListBox2.AddItem
                        Me.ListBox2.List(i - colSelect, 0) = c(1, colSelect - 1).Value
                        Me.ListBox2.List(i - colSelect, 1) = c(1, colSelect - 1).Value
                        
                       i = i + 1
                   Next
                                    
               End With

End Sub

Code: Select all

                   Me.ListBox2.ColumnCount = colSelect
                   
                   i = colSelect
                   For Each c In .Range("B2:E" & LastRow).SpecialCells(xlCellTypeVisible)

                        Me.ListBox2.AddItem
                        Me.ListBox2.List(i - colSelect, 0) = c(1, colSelect - 1).Value
                        Me.ListBox2.List(i - colSelect, 1) = c(1, colSelect - 1).Value
                        
1.ยังเรียงอยู่ใน column เดียวกันครับและซ้ำกัน 2 column ครับ

2.จาก code

Code: Select all

                        Me.ListBox2.AddItem
                        Me.ListBox2.List(i - colSelect, 0) = c(1, colSelect - 1).Value
                        Me.ListBox2.List(i - colSelect, 1) = c(1, colSelect - 1).Value
หากนำไปประยุกต์โดยการเพิ่ม AddItem จำนวน Me.ListBox2.List เกินกว่า 10 column

Code: Select all

....Me.ListBox2.List(i - colSelect, 9) = c(1, colSelect - 1).Value
เป็นต้นไป จะเกิด eror ขึ้นครับ
run time error 380 could not set the list property invalid property value
จะมีวิธีปรับ code ให้ มากกว่านี้ไหมครับ ขอบคุณครับ


add and select.xlsm
(28.05 KiB) Downloaded 13 times

Re: Advanced search with vba show on Lisbox

#4

by snasui » Sun Jun 21, 2020 6:18 pm

Totem wrote: Sun Jun 21, 2020 5:39 pm แต่ ถ้าไปเลือกชื่อ2 แผนก2 ก็จะค้นหาไม่ได้ เพราะไม่ได้...
:D ต้องปรับให้โปรแกรมรู้ว่าต้องการจะค้นจากตำแหน่งไหน ผมได้เขียนเป็นตัวอย่างการสร้างตัวแปรเอาไว้ให้แล้วใน Post ก่อน ๆ ควรจะนำมาประยุกต์กับงานนี้ครับ

Re: Advanced search with vba show on Lisbox

#3

by Totem » Sun Jun 21, 2020 5:39 pm

snasui wrote: Sun Jun 21, 2020 12:49 pm :D ทำข้อ 2 ให้ได้ก่อนครับ

ตัวอย่างการ Add Item เข้าไปใน ListBox ลองปรับใช้ดูครับ

Code: Select all

Private Sub CommandButton6_Click()              'search
   Dim LastRow&, c As Range, i As Integer
   
   Sheets("add").Range("A1").ClearContents
   Sheets("add").Range("A1").Value = TextBox1.Value
'    Me.ListBox2.Clear
   With Sheets("add")
       LastRow = Range("B" & Rows.Count).End(xlUp).Row
       If Me.ListBox2.RowSource <> "" Then
           Me.ListBox2.RowSource = ""
       End If
       
       Me.ListBox2.Clear
    
       i = 0
       For Each c In .Range("B2:E" & LastRow).SpecialCells(xlCellTypeVisible)
            Me.ListBox2.AddItem
            Me.ListBox2.List(i, 0) = c.Value
            Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
            i = i + 1
       Next
   End With

End Sub
กรุณาสังเกตการเยื้อง Code ที่ผมตอบไว้ทุกครั้งว่าเยื้องไว้อย่างไร ควรฝึกเยื้องให้ได้ตามนั้น จะทำให้ผู้ที่เข้าใจ Code อ่านได้สะดวกครับ

สำหรับการประกาศตัวแปร cells ถือว่าเป็นการประกาศตัวแปรที่ไม่เหมาะสม เพราะ cells เป็น Object หนึ่งของ Excel ที่หมายถึง Cells ทั้งหมดของชีตนั้น ๆ อาจจะเป็นปัญหาในการ Compile ของโปรแกรม เช่น Error แปลก ๆ ที่หาสาเหตุเองไม่ได้ ผมเปลี่ยนตัวแปร cells เป็น c ให้แล้วใน Code ด้านบน

:D ครับ จะจัดให้เป็นระเบียบเพื่อให้อ่านง่ายขึ้นครับ
จาก code ที่ได้มาทำให้เรียงเป็น column ได้ แต่เป็นการเรียงที่นำ column แต่ละcolumn มาเรียงถัดต่อกัน 2 column เช่น เลีอก AAA แล้ว ใน Listbox2 แสดงรายการเป็น
AAA aaa1
aaa1 ccc
ccc qqq333
qqq333
CCC ccc1
ccc1 aaa
aaa ddfrffg7
ddfeffg7

ซึ่งยังไม่ได้ตามต้องการ
ที่ได้ควรจะเป็นเหมือนใน sheet add
ในชื่อ1 แผนก1
AAA aaa1
CCC ccc1
และในชื่อ2 แผนก2 ไม่นำมาต่อด้วย
ได้ลองปรับ code For Each c In .Range("B2:B" & LastRow).SpecialCells(xlCellTypeVisible) ก็จะได้
ในชื่อ1 แผนก1
AAA aaa1
CCC ccc1

แต่ ถ้าไปเลือกชื่อ2 แผนก2 ก็จะค้นหาไม่ได้ เพราะไม่ได้

Code: Select all

Range("B2:B" & LastRow).SpecialCells(xlCellTypeVisible)
ไว้


ขอบคุณครับ


add and select.xlsm
(23.98 KiB) Downloaded 13 times

Re: Advanced search with vba show on Lisbox

#2

by snasui » Sun Jun 21, 2020 12:49 pm

:D ทำข้อ 2 ให้ได้ก่อนครับ

ตัวอย่างการ Add Item เข้าไปใน ListBox ลองปรับใช้ดูครับ

Code: Select all

Private Sub CommandButton6_Click()              'search
   Dim LastRow&, c As Range, i As Integer
   
   Sheets("add").Range("A1").ClearContents
   Sheets("add").Range("A1").Value = TextBox1.Value
'    Me.ListBox2.Clear
   With Sheets("add")
       LastRow = Range("B" & Rows.Count).End(xlUp).Row
       If Me.ListBox2.RowSource <> "" Then
           Me.ListBox2.RowSource = ""
       End If
       
       Me.ListBox2.Clear
    
       i = 0
       For Each c In .Range("B2:E" & LastRow).SpecialCells(xlCellTypeVisible)
            Me.ListBox2.AddItem
            Me.ListBox2.List(i, 0) = c.Value
            Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
            i = i + 1
       Next
   End With

End Sub
กรุณาสังเกตการเยื้อง Code ที่ผมตอบไว้ทุกครั้งว่าเยื้องไว้อย่างไร ควรฝึกเยื้องให้ได้ตามนั้น จะทำให้ผู้ที่เข้าใจ Code อ่านได้สะดวกครับ

สำหรับการประกาศตัวแปร cells ถือว่าเป็นการประกาศตัวแปรที่ไม่เหมาะสม เพราะ cells เป็น Object หนึ่งของ Excel ที่หมายถึง Cells ทั้งหมดของชีตนั้น ๆ อาจจะเป็นปัญหาในการ Compile ของโปรแกรม เช่น Error แปลก ๆ ที่หาสาเหตุเองไม่ได้ ผมเปลี่ยนตัวแปร cells เป็น c ให้แล้วใน Code ด้านบน

Advanced search with vba show on Lisbox

#1

by Totem » Sun Jun 21, 2020 12:24 pm

:D เรียนอาจารย์และเพื่อนสมาชิกทุกท่าน

Advanced search with vba ที่อาจารย์ได้เขียนให้เป็นตัวอย่าง ได้นำมาใช้ร่วมกับ Lisbox2 โดย
ได้เขียน code ให้ ค้นหา search ใน

Code: Select all

Private Sub CommandButton6_Click()           

            Sheets("add").Range("A1").ClearContents
            
            Sheets("add").Range("A1").Value = TextBox1.Value
            
                        
             Dim LastRow&, cells As Range
         
  '          Me.ListBox1.Clear
            
            With Sheets("add")
            LastRow = Range("B" & Rows.Count).End(xlUp).Row
            
            For Each cells In .Range("B2:E" & LastRow).SpecialCells(xlCellTypeVisible)
            
            ListBox2.AddItem cells.Value
            
            Next
            End With

End Sub
ลำดับขั้นตอน มีดังนี้
1.เมื่อเปิด userform1 ใน Listbox2 จะยังเป็นหน้าต่างว่าง
2.เมื่อทำการพิมพ์รายการลงใน textbox1 เช่น AAA กดปุ่นค้นหา
ค้นหาได้ครับ แต่มีปัญหาไปอยู่ใน column เดียวกันทั้งหมด
ซึ่งที่ต้องการอยากให้ไปเห็นรายการในแถว row ปกติ เหมือนใน sheets add ตามที่ได้ใช้
Advanced search with vba
ให้ปรับ code เรียงเป็นแนวนอนครับ

Code: Select all

ListBox2.AddItem cells.Value
3.หากเรากดปุ่ม ชื่อ แผนก 1 หรือ ชื่อ แผนก 2 ตามความต้องการ ได้ตามปกติ
แต่มีปัญหาต่อมาว่า เมื่อไปทำรายการใน ข้อ 2 ใหม่อีกครั้ง คือ ค้นหารายการใหม่อีกครั้ง
เช่น เลือก ชื่อ แผนก 1 มาแสดงรายการเรียบร้อยแล้ว พิมพ์ AAA ใน textbox1 กดปุ่มค้นหา

ขี้น Run-time error '-2147467259 (80004005)':
Unspecified error
ให้แสดงรายการตามที่ค้นหาครับ

บรรทัดที่

Code: Select all

Me.ListBox2.Clear



ขอบคุณครับ



add and select.xlsm
(28.56 KiB) Downloaded 19 times

Top