kangkongflea Ответов: 1

Есть ли способ улучшить эту запрограммированную пользователем функцию VBA "find"?


Я наткнулся на этот код VBA (от https://www.wallstreetmojo.com/vba-find-function/#popmake-95356)
Sub FindIt ()
Dim FindThat As String
Dim Rng1 As Range
FindS = InputBox ("Enter the value you want to search")
With Sheets ("Sheet2").Range("A:A")
   Set Rng = .Find(What:=FindString, After:=Range("A2"))
   If Not Rng Is Nothing Then
                  Application.Goto Rng, True
              Else
                  MsgBox "Nothing Found"
              End If
              End With
End Sub


Если я это понимаю, разве мой английский язык-алгоритм этого ниже не будет правильно описывать код выше?
Begin Function
 Set Dim to FindThat As String
 Set Dim to Rng1 As Range
Have FindS as InputBox with Text ("Enter the value you want to search")
With Excel Sheet ("Sheet2") staring at Range("A:A")
     Set Rng on FindString looking after value in Range("A2")
     If Rng matches value then
                  Show match
              Else
                  Show MsgBox as "Nothing Found"
              End If loop
              End With loop
End Function


Правильно ли я его истолковал?

Если это верно, то разве этот код не ограничивает свой поиск одним значением в одном столбце?
Я хочу изменить код таким образом, чтобы найти значение типа "4 1 2 4 0 2" и его варианты можно было найти на рабочем листе.
https://i345.photobucket.com/albums/p372/larawanflea/Untitled_zpsgpoc7yfo.jpg[^]

Следовательно...
1) Можно ли искать варианты значения в строке по нескольким столбцам?
2) какая строка должна быть изменена в коде, чтобы это произошло?

Что я уже пробовал:

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

Richard MacCutchan

Измените код в соответствии с вашими требованиями и выполните некоторые тесты, исправьте циклы, пока он не заработает.

1 Ответов

Рейтинг:
6

CHill60

1. Этот код действительно ограничивает поиск одним значением в одном столбце.

2. Как вы интерпретировали код довольно странно, например

Set Dim to FindThat As String
Нет - эту строку следует интерпретировать как
declare a variable called 'FindThat' which is of type 'String'
Свои мысли
Have FindS as InputBox with Text ("Enter the value you want to search")
должно быть
Display an Input box with the caption 'Enter the value you want to search' and assign the user input to the variable 'FindS'
Ваша интерпретация утверждения with также ошибочна
With Excel Sheet ("Sheet2") staring at Range("A:A")
должно быть
The following lines of code (up to the End With) refer to sheet "Sheet2", Column A
Здесь нет понятия "начать с".
Фраза
Set Rng on FindString looking after value in Range("A2")
в этом нет никакого смысла. Это должно быть что-то вроде
Search for the text in variable 'FindS' ignoring any cells before A2 and assign the result to variable 'Rng'
Даже
If Rng matches value then
             Show match
должно быть
If there is a cell result in variable 'Rng' then position the cursor in that cell
В остальном ты все правильно понял.
3. Вы спросили
Цитата:
Можно ли искать варианты значения в строке по нескольким столбцам?
Да.

Для поиска по нескольким столбцам измените
With Sheets ("Sheet2").Range("A:A")
к
With Sheets ("Sheet2").Range("A:Z")
или любые столбцы, которые вы хотите найти. Вы также можете использовать
With Sheets ("Sheet2").UsedRange

Чтобы найти множество значений (вариаций), вы можете сделать что-то вроде этого
Sub FindIt()

    Dim wb As Workbook
    Set wb = ThisWorkbook   'Change this or ask the user which workbook to search

    Dim variations As New Collection
    Dim FindS As Variant
    FindS = "start"
    Do While Len(FindS) > 0
        FindS = InputBox("Enter a value you want to search for")
        If Len(FindS) > 0 Then
            variations.Add FindS
        End If
    Loop
    
    For Each FindS In variations
        Application.StatusBar = "Searching for " & FindS
        Dim Rng As Range
        Set Rng = wb.Sheets("Sheet2").Range("A1")
        Do While Not Rng Is Nothing
            With wb.Sheets("Sheet2").UsedRange
               Set Rng = .Find(What:=FindS, After:=Rng)
               If Not Rng Is Nothing Then
                    Application.Goto Rng, True
                    Rng.Font.Color = vbRed
                    If MsgBox("Do you want to keep searching?", vbQuestion + vbYesNo + vbDefaultButton2, "Searching...") <> vbYes Then
                        Set Rng = Nothing
                    End If
                Else
                    MsgBox "Nothing Found"
                End If
            End With
        Loop
    Next
    Application.StatusBar = ""
End Sub
Я оставлю, как работать с перестановками строки для вас, чтобы обнаружить. Мой пример кода просит пользователя ввести варианты - если вы их разработаете, просто заполните эту же коллекцию.