Я пытаюсь создать пользовательскую форму поиска, и я не могу понять, как искать всю книгу и экспортировать различные значения ячеек из строки, где было найдено значение, в другое текстовое поле в форме.
Вот код, с которого я начал работать:
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
Идея заключается в том, чтобы иметь возможность обновлять информацию о строке в форме.
Спасибо за помощь!
То, что вам, вероятно, нужно сделать из того, что я вижу, — это петля через каждый диапазон рабочих листов, который вам нужно найти, что вы ищете. Что-то вроде этого ниже будет петля через каждый используемый диапазон листов, как вы сделали в вас код для одного листа,
Но, будьте осторожны, делая это, b / c, если каждый диапазон большой, это может занять некоторое время. Если это так, загрузка данных в память и циклическое прохождение через нее было бы намного быстрее.
Кроме того, я бы опасался называть переменную
SearchRange
, поскольку это может вызвать некоторую путаницу, возможно, что-то похожееsrchRange
или что-то подобное.