Проверить, содержит ли строка другую строку

Я хочу найти, содержит ли строка "," (запятая). Есть ли у нас какой-либо другой вариант, кроме чтения посимвольно?


person krishna    schedule 23.03.2013    source источник
comment
INSTR вам подходит?   -  person Stephen Quan    schedule 23.03.2013


Ответы (5)


Используйте функцию Instr.

Dim pos As Integer

pos = InStr("find the comma, in the string", ",")

вернет 15 в pos

Если не найдено, возвращается 0

Если вам нужно найти запятую в формуле Excel, вы можете использовать функцию =FIND(",";A1).

Обратите внимание, что если вы хотите использовать Instr для поиска позиции строки без учета регистра, используйте третий параметр Instr и присвойте ему константу vbTextCompare (или просто 1 для упорных).

Dim posOf_A As Integer

posOf_A = InStr(1, "find the comma, in the string", "A", vbTextCompare)

даст вам значение 14.

Обратите внимание, что в этом случае вы должны указать начальную позицию, как указано в спецификации, на которую я ссылаюсь: Аргумент start требуется, если указано сравнение.

person rene    schedule 23.03.2013
comment
Но что, если найденная строка находится в позиции 0? Как отличить найдено по индексу 0 от не найдено (0)? - person gEdringer; 29.08.2016
comment
@gEdringer. Когда искомая строка находится в начале, она возвращает 1. - person rene; 29.08.2016

Вы также можете использовать специальное слово like:

Public Sub Search()
  If "My Big String with, in the middle" Like "*,*" Then
    Debug.Print ("Found ','")
  End If
End Sub
person Makah    schedule 12.03.2015
comment
Ссылка на формат шаблона msdn.microsoft.com/en -нас/библиотека/ - person Matthew Lock; 30.08.2015

Существует также функция InStrRev, которая выполняет тот же тип вещь, но начинает поиск с конца текста в начало.

Согласно ответу @rene...

Dim pos As Integer
pos = InStrRev("find the comma, in the string", ",")

... все равно вернет 15 в pos, но если строка содержит более одной строки поиска, например слово "the", то:

Dim pos As Integer
pos = InStrRev("find the comma, in the string", "the")

... вернет 20 на позицию вместо 6.

person LimaNightHawk    schedule 14.07.2014

Основываясь на ответе Рене, вы также можете написать функцию, которая возвращает TRUE, если подстрока присутствует, или FALSE, если ее нет:

Public Function Contains(strBaseString As String, strSearchTerm As String) As Boolean
'Purpose: Returns TRUE if one string exists within another
On Error GoTo ErrorMessage
    Contains = InStr(strBaseString, strSearchTerm)
Exit Function
ErrorMessage:
MsgBox "The database has generated an error. Please contact the database administrator, quoting the following error message: '" & Err.Description & "'", vbCritical, "Database Error"
End
End Function
person Sinister Beard    schedule 07.08.2014
comment
Какую ошибку базы данных мы ожидаем в этой функции? Перехват ошибок и сообщение об ошибке кажутся совершенно бессмысленными. - person Roobie Nuby; 03.12.2014
comment
@RoobieNuby Это просто моя обработка ошибок по умолчанию. Я включаю его во все свои функции, потому что, если что-то пойдет не так, я хочу, чтобы сотрудники звонили мне, а не пытались исправить это сами. - person Sinister Beard; 03.12.2014

Вы бы не хотели делать это, учитывая существующие функции Instr/InstrRev, но бывают случаи, когда удобно использовать EVALUATE для возврата результата функций рабочего листа Excel в VBA.

Option Explicit

Public Sub test()

    Debug.Print ContainsSubString("bc", "abc,d")

End Sub
Public Function ContainsSubString(ByVal substring As String, ByVal testString As String) As Boolean
    'substring = string to test for; testString = string to search
    ContainsSubString = Evaluate("=ISNUMBER(FIND(" & Chr$(34) & substring & Chr$(34) & ", " & Chr$(34) & testString & Chr$(34) & "))")

End Function
person QHarr    schedule 03.01.2021