Настраиваемая форма поиска и обновления VBA

Я пытаюсь создать пользовательскую форму поиска, и я не могу понять, как искать всю книгу и экспортировать различные значения ячеек из строки, где было найдено значение, в другое текстовое поле в форме.

Вот код, с которого я начал работать:

Private Sub TextBox_Find_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Calls the FindAllMatches routine as user types text in the textbox

    Call FindAllMatches

End Sub

Private Sub Label_ClearFind_Click()
'Clears the find text box and sets focus

    Me.TextBox_Find.Text = ""
    Me.TextBox_Find.SetFocus

End Sub

Sub FindAllMatches()
'Find all matches on activesheet
'Called by: TextBox_Find_KeyUp event

Dim SearchRange As Range
Dim FindWhat As Variant
Dim FoundCells As Range
Dim FoundCell As Range
Dim arrResults() As Variant
Dim lFound As Long
Dim lSearchCol As Long
Dim lLastRow As Long

    If Len(f_FindAll.TextBox_Find.Value) > 1 Then 'Do search if text in find box is longer than 1 character.

        Set SearchRange = ActiveSheet.UsedRange.Cells

        FindWhat = f_FindAll.TextBox_Find.Value
        'Calls the FindAll function
        Set FoundCells = FindAll(SearchRange:=SearchRange, _
                                FindWhat:=FindWhat, _
                                LookIn:=xlValues, _
                                LookAt:=xlPart, _
                                SearchOrder:=xlByColumns, _
                                MatchCase:=False, _
                                BeginsWith:=vbNullString, _
                                EndsWith:=vbNullString, _
                                BeginEndCompare:=vbTextCompare)
        If FoundCells Is Nothing Then
            ReDim arrResults(1 To 1, 1 To 10)
            arrResults(1, 1) = "No Results"
        Else
            'Add results of FindAll to an array
            ReDim arrResults(1 To FoundCells.Count, 1 To 10)
            lFound = 1
            For Each FoundCell In FoundCells
                arrResults(lFound, 1) = FoundCell.Value
                arrResults(lFound, 2) = FoundCell.EntireRow.Cells(2).Value
                arrResults(lFound, 3) = FoundCell.EntireRow.Cells(4).Value
                arrResults(lFound, 4) = FoundCell.EntireRow.Cells(5).Value
                arrResults(lFound, 5) = FoundCell.EntireRow.Cells(6).Value
                arrResults(lFound, 6) = FoundCell.EntireRow.Cells(7).Value
                arrResults(lFound, 7) = FoundCell.EntireRow.Cells(17).Value
                arrResults(lFound, 8) = FoundCell.EntireRow.Cells(18).Value
                arrResults(lFound, 9) = FoundCell.EntireRow.Cells(19).Value
                arrResults(lFound, 10) = FoundCell.Address
                lFound = lFound + 1
            Next FoundCell
        End If

        'Populate the listbox with the array
        Me.ListBox_Results.List = arrResults

    Else
        Me.ListBox_Results.Clear
    End If

   End Sub

   Private Sub ListBox_Results_Click()
   'Go to selection on sheet when result is clicked

   Dim strAddress As String
   Dim l As Long

    For l = 0 To ListBox_Results.ListCount
        If ListBox_Results.Selected(l) = True Then
            strAddress = ListBox_Results.List(l, 9)
            ActiveSheet.Range(strAddress).Select
            GoTo EndLoop
        End If
    Next l

EndLoop:

End Sub

Private Sub CommandButton_Close_Click()
'Close the userform

    Unload Me

End Sub

Идея заключается в том, чтобы иметь возможность обновлять информацию о строке в форме.
Спасибо за помощь!

1 ответ

  1. То, что вам, вероятно, нужно сделать из того, что я вижу, — это петля через каждый диапазон рабочих листов, который вам нужно найти, что вы ищете. Что-то вроде этого ниже будет петля через каждый используемый диапазон листов, как вы сделали в вас код для одного листа,

    Dim ws As Worksheet
    Dim SearchRange As Range
    
    
        For Each ws In ActiveWorkbook.Sheets
           For Each SearchRange In ws.UsedRange.Cells
             'do your stuff
              Set FoundCells = FindAll(SearchRange:=SearchRange, ..... 
             'do more stuff            
           Next SearchRange
        Next ws
    

    Но, будьте осторожны, делая это, b / c, если каждый диапазон большой, это может занять некоторое время. Если это так, загрузка данных в память и циклическое прохождение через нее было бы намного быстрее.

    Кроме того, я бы опасался называть переменнуюSearchRange, поскольку это может вызвать некоторую путаницу, возможно, что-то похожее srchRangeили что-то подобное.