Synaptic Engima
Synaptic Engima

Reputation: 157

How do I get vba loop result to populate a combobox?

Problem: I need to search a list of worksheets in the active workbook and return the name of every worksheet that has a cell whose value matches a search input. The names of these worksheets need to then populate a userform combobox with duplicates.

Partial Solution: I've been able to reverse-engineer a piece of code that does most of the above. However, the worksheet names currently populate a msgbox with duplication. How would I make this result populate a combobox instead?

I've been experimenting with outputting to a collection as well as writing results to a new worksheet, but these option are still in the conceptual phase, so I have no code to post.

UPDATE (some code):

Public Sub FindDate()
'find date data on all sheets

Dim ws As Worksheet
Dim rngFind As Range
Dim myDate As String
Dim firstAddress As String
Dim addressStr As String
Dim findNum As Integer
Dim sheetArray(299) As Integer
Dim arrayIndex As Integer

myDate = InputBox("Enter date to find")

If myDate = "" Then Exit Sub

For Each ws In ActiveWorkbook.Worksheets
    'Do not search the following sheets
    With ws
        If ws.Name = "CM Chapters" Then GoTo myNext
        If ws.Name = "CM Codes" Then GoTo myNext
        If ws.Name = "PCS Categories" Then GoTo myNext
        If ws.Name = "PCS Chapters" Then GoTo myNext
        If ws.Name = "PCS Code" Then GoTo myNext

    Set rngFind = .Columns(41).Find(what:=myDate, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)

        If Not rngFind Is Nothing Then
        firstAddress = rngFind.Address

    Do
        findNum = findNum + 1
        addressStr = addressStr & .Name & vbCrLf

''''Original working code    
'            addressStr = addressStr & .Name & " " & rngFind.Address & vbCrLf
''''Modified to remove excess text                              

Set rngFind = .Columns(41).FindNext(rngFind)

    Loop While Not rngFind Is Nothing And rngFind.Address <> firstAddress
End If

myNext:
    End With

    Next ws

        If Len(addressStr) Then
''''    Original working code
'                MsgBox "Found: "" & myDate & "" " & findNum & " times." & vbCr & _
'                addressStr, vbOKOnly, myDate & " found in these cells"
''''    Modified to to remove excess text

            MsgBox vbCr & addressStr
        Else:
            MsgBox "Unable to find " & myDate & " in this workbook.", vbExclamation
        End If

End Sub

Upvotes: 0

Views: 1284

Answers (2)

Synaptic Engima
Synaptic Engima

Reputation: 157

Got it. Here's the final working code. Slight changes in where the variables pass to, based on additional steps not included in original question.

Private Sub CboReviewWeek_Change()
'search all worksheets for matching date and return worksheet names to combobox

Dim ws As Worksheet
Dim rngFind As Range
Dim myDate As Date
Dim firstAddress As String
Dim StrTab As String

  'Sets the variable equal to date selected
  myDate = CboReviewWeek.Value

  'object to operate on
  For Each ws In ActiveWorkbook.Worksheets

    'Exclude the following sheets from search
    With ws
        If ws.Name = "CM Chapters" Then GoTo myNext
        If ws.Name = "CM Codes" Then GoTo myNext
        If ws.Name = "PCS Categories" Then GoTo myNext
        If ws.Name = "PCS Chapters" Then GoTo myNext
        If ws.Name = "PCS Code" Then GoTo myNext

    'Run Find command on defined range and save result to range variable
    Set rngFind = .Columns(40).Find(what:=myDate, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)

        'If cell is populated, then pass said value to string variable
        If Not rngFind Is Nothing Then
        firstAddress = rngFind.Address

    Do  'do this thing

        'set string variable equal to name of worksheet
        StrTab = .Name

        'Add string variable value to Combobox
        Me.CboReviewModule.AddItem StrTab

        Loop While rngFind.Address <> firstAddress And Not rngFind Is Nothing

        'Reset the range to next worksheet and run find again
        Set rngFind = .Columns(40).FindNext(rngFind)

        End If
    End With

myNext:

    Next ws

End Sub

Upvotes: 0

Saagar Elias Jacky
Saagar Elias Jacky

Reputation: 2688

Try this

Do
    findNum = findNum + 1

    addressStr = addressStr & .Name
    ComboBox1.AddItem addressStr 'replace ComboBox1 with your ComboBox name
    addressStr = addressStr & vbCrLf ' if you still want to add the Line feed                            

    Set rngFind = .Columns(41).FindNext(rngFind)

Loop While Not rngFind Is Nothing And rngFind.Address <> firstAddress

Upvotes: 1

Related Questions