2013-07-27 8 views
1

Я использую excel VBA для поиска подстроки в другой строке, как показано ниже.Excel VBA как оператор

Dim pos As Integer 
pos = InStr("I am studying at University of Texas at Arlington", "University of Texas") 

Если pos возвращает неотрицательное значение, это означает, что я подстроку в строке. Однако мне нужен более сложный поиск, где подстрока может быть «Унив Tex»:

InStr("I am studying at University of Texas at Arlington", "Univ of Tex") 

не работает для этого.

Основываясь на максимальных поисковых запросах, я должен сказать, что подстрока присутствует. Возможно ли использование excel VBA?

+0

Да. Теперь у вас есть конкретный вопрос программирования? –

+1

Я использую excel-vba для программирования. Я пытаюсь добиться аналогичной функциональности оператора, как в sql-запросе в excel-vba. Я не знаю, почему это минус 1ед. – Ramesh

ответ

11

Like оператор уже доступен в VBA:

If "I am studying at University of Texas at Arlington" Like "*Univ*of*Texas*" Then 
    MsgBox "Yes, it is!" 
End If 
+0

Хорошая добыча! В этой ситуации это именно то, что нужно сделать. Однако «Like» часто неправильно используется для других целей, которые лучше всего используются с функцией, как я предлагаю, поэтому я стараюсь избегать ее, я думаю, что видел, что она злоупотребляла слишком много раз ... (+1) –

+0

Да , это, безусловно, можно злоупотреблять. Часто (с таблицами базы данных) люди пытаются создать слишком широкие функции поиска, когда они должны сначала сократить количество строк для поиска с критериями в других полях. –

4

Попробуйте это:

Public Function StringContainsAny(string_source As String, _ 
            ByVal caseSensitive As Boolean, _ 
            ParamArray find_values()) As Boolean 

    Dim i As Integer, found As Boolean 

    If caseSensitive Then 

     For i = LBound(find_values) To UBound(find_values) 
      found = (InStr(1, string_source, _ 
       find_values(i), vbBinaryCompare) <> 0) 
      If found Then Exit For 
     Next 

    Else 

     For i = LBound(find_values) To UBound(find_values) 
      found = (InStr(1, LCase$(string_source), _ 
       LCase$(find_values(i)), vbBinaryCompare) <> 0) 
      If found Then Exit For 
     Next 

    End If 

    StringContainsAny = found 

End Function 

Использование:

Dim SomeString As String 
SomeString = "I am studying at University of Texas at Arlington" 

Debug.Print StringContainsAny(SomeString, False, "university of texas") 'True 
Debug.Print StringContainsAny(SomeString, True, "university of texas") 'False 
Debug.Print StringContainsAny(SomeString, True, "University of Texas") 'True 

Но также :

Debug.Print StringContainsAny(SomeString, False, "TEXAS", "SMURF") 'True 

А:

Debug.Print StringContainsAny(SomeString, False, "univ", "of", "tex") 'True 

Или:

Dim Words As String() 
Words = Split("univ of tex", " ") 
Debug.Print StringContainsAny(SomeString, False, Words) 'True 

Вы можете указать столько значения, сколько вам нужно для find_values(), а функция выходит на первый матч найден.

Если вы специально хотите вернуть true, когда все части «Унив Tex» находятся в строке, вы должны настроить код немного, чтобы вернуть true, когда все передаваемые аргументы найдены в строке. Но тогда, возможно, метод должен быть переименован StringContainsAll - возможно, что-то вроде этого:

Public Function StringContainsAll(string_source As String, _ 
            ByVal caseSensitive As Boolean, _ 
            ParamArray find_values()) As Boolean 

    Dim i As Integer, found As Boolean 

    If caseSensitive Then 

     For i = LBound(find_values) To UBound(find_values) 
      found = (InStr(1, string_source, find_values(i), vbBinaryCompare) <> 0) 
      If Not found Then Exit For 
     Next 

    Else 

     For i = LBound(find_values) To UBound(find_values) 
      found = (InStr(1, LCase$(string_source), _ 
           LCase$(find_values(i)), vbBinaryCompare) <> 0) 
      If Not found Then Exit For 
     Next 

    End If 

    StringContainsAll = found 

End Function 

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

Смежные вопросы