Concat двух имен переменных, чтобы получить имя третьей переменной - PullRequest
0 голосов
/ 29 марта 2019

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

Dim FindText1 As String, FindText2 As String, ListText As String
Dim FindText As Variant

FindText1 = "Name"
FindText2 = "Surname"

For i = 1 To 2

    Dim Onecell As Range

    FindText = "FindText" & i

    For Each Onecell In Range("A1:AA1")
        If InStr(UCase(Onecell.Text), UCase(FindText)) > 0 Then
            ListText = ListText + vbNewLine + Onecell.Address(RowAbsolute:=False, ColumnAbsolute:=False) + " | " + Onecell.Value
        End If
    Next Onecell

    MsgBox ListText, vbQuestion, FindText

Next i

Каждый раз, когда я запускаю эту переменную FindText в формуле InStr, отображается как Text и «FindText1» в первом экземпляре и «FindText2» во втором.Но на самом деле он не возвращает переменную FindText1 или FindText2.

Я также пытался использовать следующее:

If InStr(UCase(Onecell.Text), UCase("FindText" & i)) > 0 Then

Но это также не работает.

Можно ли этого добиться?

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

Вот краткий пример использования массивов для упрощения цикла:

Sub SearchMe()
    Dim searchWords() As String
    searchWords = Split("Name,Surname,LastName,First Name,AnotherName")

    Dim searchRange As Range
    Set searchRange = ThisWorkbook.Sheets("Sheet1").Range("A1:AA1")

    Dim listText As String
    Dim word As String
    For Each word In searchWords
        Dim cell As Range
        For Each cell In searchRange
            If InStr(UCase(cell.Text), UCase(word)) > 0 Then
                listText = listText & vbNewLine & _
                           cell.Address(RowAbsolute:=False, ColumnAbsolute:=False) & _
                           " | " & cell.Value
            End If
        Next cell
        MsgBox listText, vbQuestion, word
    Next word
End Sub
0 голосов
/ 29 марта 2019

Вы также можете использовать коллекцию вместо массива. Работать с коллекциями очень просто, и я часто нахожу их проще и быстрее реализовать, чем массив.

Dim colFind As New Collection
dim i As integer
Dim ListText As String

' Add the words you wish to search for to the collection.
colFind.Add "Name"
colFind.Add "Surname"

For i = 1 To colFind.Count

    Dim Onecell As Range

    For Each Onecell In Range("A1:AA1")
        If InStr(UCase(Onecell.Text), UCase(colFind(i))) > 0 Then
            ListText = ListText & vbNewLine & Onecell.Address(RowAbsolute:=False, ColumnAbsolute:=False) & " | " & Onecell.Value
        End If
    Next Onecell

    MsgBox ListText, vbQuestion, colFind(i)

Next i
0 голосов
/ 29 марта 2019

Вот иллюстрация, но вы должны прочитать о массивах, поскольку их много, например, здесь .

Sub x()

Dim ListText As String
Dim FindText(1 To 2) As String
Dim Onecell As Range

FindText(1) = "Name"
FindText(2) = "Surname"

For i = LBound(FindText) To UBound(FindText)
    For Each Onecell In Range("A1:AA1")
        If InStr(UCase(Onecell.Text), UCase(FindText(i))) > 0 Then
            ListText = ListText & vbNewLine & Onecell.Address(RowAbsolute:=False, ColumnAbsolute:=False) & " | " & Onecell.Value
        End If
    Next Onecell
    MsgBox ListText, vbQuestion, FindText(i)
Next i

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...