Search code examples
excelvbasearchlistboxuserform

VBA Search Listbox Based on ComboBox Selection AND Textbox Value


Full disclosure, this a continuation of a post on Chandoo

I am a noob to VBA. I had help getting this far. My file is linked below. Why is my listbox only showing one row/result? When I select a combobox value + textbox value, I'm not getting ALL of the matching results.

TEST TO SHARE_Systems Order Entry Master_v11

For example...

Open the Userform ​Go to the frame titled: Search Existing Orders Based on Multiple Criteria Go to the combo box, and select "Shop Order" Go to the textbox and enter "A" Click on the search button

The listbox only displays one row/result. If you clear the search, you can see there are 4 rows that match the search criteria.

Thank you in advance!

Private Sub UserForm_Initialize()
'redacted code
    Sheets("Master").Activate 

'***Populates the listbox and only displays 9 columns. Remaining columns are hidden by entering '0' width.***
    lstMaster.ColumnWidths = "0;0;40;80;0;0;0;0;0;0;0;0;50;0;0;0;0;0;0;0;0;60;0;0;0;0;0;0;0;0;50;40;0;0;0;0;0;70;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;139;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;139;0;0;0;0;"
    lstMaster.ColumnCount = 106    'Number of Columns in the ListBox
    lstMaster.List = Sheets("Master").Range("A4:DB" & Sheets("Master").Cells(Rows.Count, 1).End(xlUp).Row).Value

'***Add items to combobox list. Each list item MUST match their respective column header.
    cboSearchItem.AddItem "Shop Order"
    cboSearchItem.AddItem "Suffix"
    cboSearchItem.AddItem "Proposal"
    cboSearchItem.AddItem "PO"
    cboSearchItem.AddItem "SO"
    cboSearchItem.AddItem "Quote"
    cboSearchItem.AddItem "Transfer Order"
    cboSearchItem.AddItem "Customer Name"
    cboSearchItem.AddItem "End User Name"

'redacted code
End Sub

'***Search Multiple Orders Button***
Private Sub cmbSearchOrders_Click()
    Dim sat, s As Long
    Dim deg1, deg2 As String 'deg1 = cells(Row Index,Column Letter); 'deg2 = txtSearch.Value

'***Message popups if search value and/or search criteria are blank***
    Sheets("Master").Activate
    Application.ScreenUpdating = False 'Setting to 'false' speeds up the macro
    If Me.txtSearch.Value = "" Then 'Condition if the textbox is blank
            MsgBox "Please enter a search value.", vbOKOnly + vbExclamation, "Search" 'vbOKOnly shows only the OK button, vbExclamation shows exclamation point icon
            txtSearch.SetFocus
        Exit Sub
    End If
    If cboSearchItem.Value = "" Then ' Condition if combobox is blank
            MsgBox "Please select search criteria.", vbOKOnly + vbExclamation, ""
            cboSearchItem.SetFocus
        Exit Sub
    End If
    
    With lstMaster
            .Clear
            .ColumnCount = 106
            .ColumnWidths = "0;0;40;80;0;0;0;0;0;0;0;0;50;0;0;0;0;0;0;0;0;60;0;0;0;0;0;0;0;0;50;40;0;0;0;0;0;70;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;139;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;139;0;0;0;0;"
    End With

'***Progress Bar***
    Call Main
    deg2 = txtSearch.Value

    Select Case cboSearchItem.Value
            Case "Shop Order"
                RN = 4 'column number
            Case "Suffix"
                RN = 3
            Case "Proposal"
                RN = 13
            Case "PO"
                RN = 22
        Case "SO"
                RN = 31
            Case "Quote"
                RN = 32
            Case "Transfer Order"
                RN = 38
            Case "Customer Name"
                RN = 79
            Case "End User Name"
                RN = 102
    End Select

        For sat = 4 To Cells(Rows.Count, RN).End(xlUp).Row
        deg1 = Cells(sat, RN) 
        If UCase(deg1) Like UCase(deg2) & "*" Then 'Renders txtSearch case insensitive
            lstMaster.AddItem
                For c = 0 To 105 'column index
                lstMaster.List(s, c) = Cells(sat, c + 1) 'c+1 = column index + 1 = column number
            Next c
        End If
    Next
    Application.ScreenUpdating = True
    lblProgResults = lstMaster.ListCount
End Sub

'***1 of 2 Search Results in Listbox***
Private Sub txtSearch_Change()
On Error Resume Next
  lijst = [Master].Value
        arg = 0
        For i = 1 To UBound(lijst) 'gets the maximum length of the array lijst
            If InStr(1, lijst(i, 1), txtSearch, vbTextCompare) > 0 Then
               arg = arg + 1
            End If
       Next i
        ReDim nwlijst(arg - 1, 106)
        arg = 0
        For i = 1 To UBound(lijst)
            If InStr(1, lijst(i, 1), txtSearch, vbTextCompare) > 0 Then
                For K = 1 To 106
                    nwlijst(arg, K - 1) = lijst(i, K)
                Next K
                arg = arg + 1
            End If
        Next
        lstResults.List = nwlijst
End Sub

'***2 of 2 Search Results in Listbox***
Sub Reset()
With lstResults
.List = [Master].Value
.ListIndex = -1
End With
cmbNew.Enabled = True
cmbSave.Enabled = True
For Each ctrl In Controls
        If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Or TypeName(ctrl) = "CheckBox" Then ctrl.Value = ""
    Next ctrl
End Sub

I need to shorten the code, because when I added a ninth column, I reached the limit for the length of code in a single procedure. Here is the original, long code, that works, but only for eight listbox columns. I had help to shorten the code AND include a ninth column. Per my post above, I'm only getting one result/row in the listbox. Note, I this 'older' code shows 114 columns in worksheet ("MASTER"). My newer version has 106.

'***Search Button***
Private Sub cmbSearch_Click()
    Dim sat, s As Long
    Dim deg1, deg2 As String 'deg1 = cells(Row Index,Column Letter)and deg2 = txtSearch.Value

'redacted code

'***CODE IMPACTED BY COLUMN ADDITIONS OR DELETIONS***
    With lstMaster
            .Clear
            .ColumnCount = 114
            .ColumnWidths = "65;0;0;0;0;0;0;0;0;0;40;0;45;0;0;0;0;0;0;0;45;0;0;0;0;0;0;0;0;42;30;0;0;0;0;0;60;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;75;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
    End With

'***Progress Bar***
    Call Main
    deg2 = txtSearch.Value

    Select Case cboSearchItem.Value

'***Search for Shop Order Number***
        Case "Shop Order"
            For sat = 3 To Cells(Rows.Count, 1).End(xlUp).Row  
            deg1 = Cells(sat, "A") 'Row Index = 'sat', Column Index = 'A'
        If UCase(deg1) Like UCase(deg2) & "*" Then 'Renders txtSearch case insensitive as long as you do not assign a case to txtSearch
            lstMaster.AddItem 'Using column index which starts with '0' vs column number which starts with '1'
            lstMaster.List(s, 0) = Cells(sat, "A") 'Shop Order Number
            lstMaster.List(s, 1) = Cells(sat, "B") 'Email Subject Line
            lstMaster.List(s, 2) = Cells(sat, "C") 'Stage
            lstMaster.List(s, 3) = Cells(sat, "D") 'Stage Due
            lstMaster.List(s, 4) = Cells(sat, "E") 'E10 Status
            lstMaster.List(s, 5) = Cells(sat, "F") 'Start Date
            lstMaster.List(s, 6) = Cells(sat, "G") 'End Date
            lstMaster.List(s, 7) = Cells(sat, "H") 'Days To Process
            lstMaster.List(s, 8) = Cells(sat, "I") 'Reason
            lstMaster.List(s, 9) = Cells(sat, "J") 'Prefix
            lstMaster.List(s, 10) = Cells(sat, "K") 'Suffix
            lstMaster.List(s, 11) = Cells(sat, "L") 'Notes
            lstMaster.List(s, 12) = Cells(sat, "M") 'Proposal Number
            lstMaster.List(s, 13) = Cells(sat, "N") 'Salesperson
            lstMaster.List(s, 14) = Cells(sat, "O") 'Proposal Date
            lstMaster.List(s, 15) = Cells(sat, "P") 'Lead Time
            lstMaster.List(s, 16) = Cells(sat, "Q") 'Promised Date
            lstMaster.List(s, 17) = Cells(sat, "R") 'Expiration Date
            lstMaster.List(s, 18) = Cells(sat, "S") 'Cost
            lstMaster.List(s, 19) = Cells(sat, "T") 'Margin
            lstMaster.List(s, 20) = Cells(sat, "U") 'PO
            lstMaster.List(s, 21) = Cells(sat, "V") 'PO Date
            lstMaster.List(s, 22) = Cells(sat, "W") 'PO Received Date
            lstMaster.List(s, 23) = Cells(sat, "X") 'PO Amount
            lstMaster.List(s, 24) = Cells(sat, "Y") 'PO Terms
            lstMaster.List(s, 25) = Cells(sat, "Z") 'Ship Via
            lstMaster.List(s, 26) = Cells(sat, "AA") 'Ship Type
            lstMaster.List(s, 27) = Cells(sat, "AB") 'Ship Charges
            lstMaster.List(s, 28) = Cells(sat, "AC") 'Shipping Instructions
            lstMaster.List(s, 29) = Cells(sat, "AD") 'SO
            lstMaster.List(s, 30) = Cells(sat, "AE") 'Quote
            lstMaster.List(s, 31) = Cells(sat, "AF") 'Project Manager
            lstMaster.List(s, 32) = Cells(sat, "AG") 'Short System Description
            lstMaster.List(s, 33) = Cells(sat, "AH") 'Long System Description
            lstMaster.List(s, 34) = Cells(sat, "AI") 'S-Code
            lstMaster.List(s, 35) = Cells(sat, "AJ") 'BMTH
            lstMaster.List(s, 36) = Cells(sat, "AK") 'Transfer Order Number
            lstMaster.List(s, 37) = Cells(sat, "AL") 'Installation Days
            lstMaster.List(s, 38) = Cells(sat, "AM") 'Start Up Days
            lstMaster.List(s, 39) = Cells(sat, "AN") 'Training Days Onsite
            lstMaster.List(s, 40) = Cells(sat, "AO") 'Training Days In Toledo
            lstMaster.List(s, 41) = Cells(sat, "AP") 'Vendor Field Service Days
            lstMaster.List(s, 42) = Cells(sat, "AQ") 'Service Technician
            lstMaster.List(s, 43) = Cells(sat, "AR") 'Standard Hours 1st & 2nd Shift
            lstMaster.List(s, 44) = Cells(sat, "AS") 'Standard Hours 3rd Shift
            lstMaster.List(s, 45) = Cells(sat, "AT") 'Saturday, Sunday or Holidays
            lstMaster.List(s, 46) = Cells(sat, "AU") 'Additional Overtime
            lstMaster.List(s, 47) = Cells(sat, "AV") 'Travel Less Than 8 Hours
            lstMaster.List(s, 48) = Cells(sat, "AW") 'Travel More Than 8 Hours
            lstMaster.List(s, 49) = Cells(sat, "AX") 'Airfare
            lstMaster.List(s, 50) = Cells(sat, "AY") 'Hotel
            lstMaster.List(s, 51) = Cells(sat, "AZ") 'Car Rental
            lstMaster.List(s, 52) = Cells(sat, "BA") 'Meals
            lstMaster.List(s, 53) = Cells(sat, "BB") 'Mileage
            lstMaster.List(s, 54) = Cells(sat, "BC") 'Parking
            lstMaster.List(s, 55) = Cells(sat, "BD") 'Service Parts 1
            lstMaster.List(s, 56) = Cells(sat, "BE") 'Service Parts 2
            lstMaster.List(s, 57) = Cells(sat, "BF") 'Booking Fees
            lstMaster.List(s, 58) = Cells(sat, "BG") 'Total
            lstMaster.List(s, 59) = Cells(sat, "BH") 'Service Group
            lstMaster.List(s, 60) = Cells(sat, "BI") 'Repair Technician
            lstMaster.List(s, 61) = Cells(sat, "BJ") 'Repair1
            lstMaster.List(s, 62) = Cells(sat, "BK") 'Amt1
            lstMaster.List(s, 63) = Cells(sat, "BL") 'Repair2
            lstMaster.List(s, 64) = Cells(sat, "BM") 'Amt2
            lstMaster.List(s, 65) = Cells(sat, "BN") 'Repair3
            lstMaster.List(s, 66) = Cells(sat, "BO") 'Amt3
            lstMaster.List(s, 67) = Cells(sat, "BP") 'Repair4
            lstMaster.List(s, 68) = Cells(sat, "BQ") 'Amt4
            lstMaster.List(s, 69) = Cells(sat, "BR") 'Repair5
            lstMaster.List(s, 70) = Cells(sat, "BS") 'Amt5
            lstMaster.List(s, 71) = Cells(sat, "BT") 'Repair6
            lstMaster.List(s, 72) = Cells(sat, "BU") 'Amt6
            lstMaster.List(s, 73) = Cells(sat, "BV") 'Repair7
            lstMaster.List(s, 74) = Cells(sat, "BW") 'Amt7
            lstMaster.List(s, 75) = Cells(sat, "BX") 'Repair8
            lstMaster.List(s, 76) = Cells(sat, "BY") 'Amt8
            lstMaster.List(s, 77) = Cells(sat, "BZ") 'Repair Total
            lstMaster.List(s, 78) = Cells(sat, "CA") 'Repair Group
            lstMaster.List(s, 79) = Cells(sat, "CB") 'CustID
            lstMaster.List(s, 80) = Cells(sat, "CC") 'Customer Name
            lstMaster.List(s, 81) = Cells(sat, "CD") 'Bill To
            lstMaster.List(s, 82) = Cells(sat, "CE") 'Address1
            lstMaster.List(s, 83) = Cells(sat, "CF") 'Address2
            lstMaster.List(s, 84) = Cells(sat, "CG") 'City
            lstMaster.List(s, 85) = Cells(sat, "CH") 'State
            lstMaster.List(s, 86) = Cells(sat, "CI") 'ZipCode
            lstMaster.List(s, 87) = Cells(sat, "CJ") 'Country
            lstMaster.List(s, 88) = Cells(sat, "CK") 'Diamond Distributor
            lstMaster.List(s, 89) = Cells(sat, "CL") 'Tax Exempt
            lstMaster.List(s, 90) = Cells(sat, "CM") 'Contact 1 Name
            lstMaster.List(s, 91) = Cells(sat, "CN") 'Contact 1 Email
            lstMaster.List(s, 92) = Cells(sat, "CO") 'Contact 2 Name
            lstMaster.List(s, 93) = Cells(sat, "CP") 'Contact 2 Email
            lstMaster.List(s, 94) = Cells(sat, "CQ") 'Ship To ID
            lstMaster.List(s, 95) = Cells(sat, "CR") 'Ship To Name
            lstMaster.List(s, 96) = Cells(sat, "CS") 'Ship To Address 1
            lstMaster.List(s, 97) = Cells(sat, "CT") 'Ship To Address 2
            lstMaster.List(s, 98) = Cells(sat, "CU") 'Ship To City
            lstMaster.List(s, 99) = Cells(sat, "CV") 'Ship To State
            lstMaster.List(s, 100) = Cells(sat, "CW") 'Ship To Zip Code
            lstMaster.List(s, 101) = Cells(sat, "CX") 'Ship To Country
            lstMaster.List(s, 102) = Cells(sat, "CY") 'End User Name
            lstMaster.List(s, 103) = Cells(sat, "CZ") 'EUID
            lstMaster.List(s, 104) = Cells(sat, "DA") 'Entered In E10
            lstMaster.List(s, 105) = Cells(sat, "DB") 'Confirmation Of PO
            lstMaster.List(s, 106) = Cells(sat, "DC") 'Request Approval (Finance)
            lstMaster.List(s, 107) = Cells(sat, "DD") 'Request PM
            lstMaster.List(s, 108) = Cells(sat, "DE") 'PM Assigned
            lstMaster.List(s, 109) = Cells(sat, "DF") 'SO To Team/PM
            lstMaster.List(s, 110) = Cells(sat, "DG") 'Approved (Finance)
            lstMaster.List(s, 111) = Cells(sat, "DH") 'SOA To Customer
            lstMaster.List(s, 112) = Cells(sat, "DI") 'SOA Date In E10
            lstMaster.List(s, 113) = Cells(sat, "DJ") 'Request Invoice
            s = s + 1
        End If
    Next

 'redacted code for remaining Cases which each have the same number of code lines as Case "Shop Order"

End Sub

'***Search Results in Listbox 1 of 2***
Private Sub txtSearch_Change()
  'redacted because it is the same code as above
End Sub


'***Search Results in Listbox 2 of 2***
Sub Reset()
  'redacted because it is the same code as above
End Sub


Solution

  • You have lstMaster.List(s, c) = Cells(sat, c + 1) but then you don't increment s for each new record added, so it just updates the first record repeatedly.

    Add a line to increment s:

    For sat = 4 To Cells(Rows.Count, RN).End(xlUp).Row
        deg1 = Cells(sat, RN) 
        If UCase(deg1) Like UCase(deg2) & "*" Then 'Renders txtSearch case insensitive
            lstMaster.AddItem
            For c = 0 To 105 'column index
                lstMaster.List(s, c) = Cells(sat, c + 1) 'c+1 = column index + 1 = column number
            Next c
            s = s + 1 '<<<<<<<<<<<<<<<<
        End If
    Next