Sprawdź, czy ciąg zawiera inny ciąg

232

Chcę sprawdzić, czy ciąg zawiera znak „,” (przecinek). Czy mamy jakąś inną opcję niż czytanie char-by-char?

krishna
źródło
14
Czy INSTRdziała dla ciebie?
Stephen Quan

Odpowiedzi:

385

Użyj funkcji Instr

Dim pos As Integer

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

zwróci 15 w poz

Jeśli nie zostanie znalezione, zwróci 0

Jeśli chcesz znaleźć przecinek z formułą programu Excel, możesz użyć =FIND(",";A1)funkcji.

Zauważ, że jeśli chcesz użyć Instrdo znalezienia pozycji łańcucha bez rozróżniania wielkości liter, użyj trzeciego parametru Instr i nadaj mu const vbTextCompare(lub tylko 1 dla trudnych warunków).

Dim posOf_A As Integer

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

da ci wartość 14.

Zauważ, że w tym przypadku musisz określić pozycję początkową, jak podano w specyfikacji, którą połączyłem: Argument początkowy jest wymagany, jeśli podano porównanie.

przedłużyć
źródło
4
Ale co jeśli znaleziony ciąg znajduje się w pozycji 0? Jak odróżnić „znaleziono w indeksie 0” od „nie znaleziono (0)”?
gEdringer
10
@gEdringer. Gdy ciąg, który należy znaleźć, znajduje się na początku, zwraca 1.
odnów
69

Możesz także użyć słowa specjalnego like:

Public Sub Search()
  If "My Big String with, in the middle" Like "*,*" Then
    Debug.Print ("Found ','")
  End If
End Sub
Makah
źródło
3
Link do formatu wzoru msdn.microsoft.com/en-us/library/…
Matthew Lock
23

Istnieje również funkcja InStrRev, która wykonuje te same czynności, ale rozpoczyna wyszukiwanie od końca tekstu do początku.

Odpowiedź Per @ rene ...

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

... nadal zwróciłby 15 do pozycji pos, ale jeśli ciąg ma więcej niż jeden ciąg wyszukiwania, na przykład słowo „the”, to:

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

... zwróci 20 do pozycji zamiast 6.

LimaNightHawk
źródło
17

Opierając się na odpowiedzi Rene, możesz również napisać funkcję, która zwróci PRAWDA, jeśli podciąg był obecny, lub FAŁSZ, jeśli nie był:

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
Sinister Beard
źródło
3
Jakiego rodzaju błędu bazy danych oczekujemy w tej funkcji? Pułapka na błędy i komunikat o błędzie wydają się całkowicie bezcelowe.
Roobie Nuby,
11
@RoobieNuby To tylko moja domyślna obsługa błędów. Włączam to we wszystkich moich funkcjach, ponieważ jeśli coś pójdzie nie tak, chcę, żeby personel do mnie zadzwonił, a nie sam próbował tego naprawić.
Sinister Beard