Track
Jeśli napisałeś już kilka makr VBA, pewnie trafiłeś na moment, gdy musisz sprawdzić, czy jakiś tekst występuje w komórce. W VBA InStr to jedna z tych funkcji, których używasz wszędzie. Mówi ci, gdzie jeden fragment tekstu pojawia się w innym. Możesz jej użyć, by sprawdzić, czy tekst istnieje w komórce, sparsować wartości w tekście albo sterować logiką warunkową w makrach zależnych od wzorców tekstowych.
W tym przewodniku przeprowadzę cię przez składnię InStr, kilka przykładów, sposób działania trybów porównania (ten element potrafi sprawić więcej kłopotów, niż powinien) oraz kilka wzorców, które faktycznie wykorzystasz ponownie.
Polecam zacząć od naszego Excel Fundamentals, żeby zbudować solidne podstawy przed przejściem do VBA, albo, jeśli masz już trochę doświadczenia, wziąć udział w kursie Advanced Excel Functions, aby dowiedzieć się, jak funkcje zwiększają efektywność w analizie danych.
Czym jest funkcja VBA InStr?
InStr to funkcja VBA, która zwraca pozycję pierwszego wystąpienia jednego łańcucha wewnątrz drugiego.
Wyniki zachowują się następująco:
- Jeśli znajdzie, zwraca liczbę (pozycję, od której zaczyna się dopasowanie)
- Jeśli niczego nie znajdzie, zwraca 0
Na przykład, jeśli „cat” pojawia się na pozycji 5 w łańcuchu, otrzymasz 5. Jeśli go nie ma, dostaniesz 0.
Składnia VBA InStr
Pełna składnia InStr wygląda tak:
InStr([start], string1, string2, [compare])
Gdzie:
-
start(opcjonalnie): Określa, od której pozycji VBA ma zacząć wyszukiwanie. Jeśli go pominiesz, VBA zaczyna od pozycji 1. -
string1(wymagane): Pełny tekst, w którym szukasz. -
string2(wymagane): Tekst, który próbujesz znaleźć. -
compare(opcjonalnie): Definiuje sposób porównania (z rozróżnianiem wielkości liter lub bez). Jeśli go pominiesz, VBA użyje domyślnego trybu porównania, zwykle z rozróżnianiem wielkości liter.
Zauważ, że możesz pominąć argumenty start i compare (InStr(string1, string2)) w prostszej wersji. Ale jeśli zdecydujesz się użyć argumentu compare, musisz też podać argument start.
Jak działa VBA InStr
Pomyśl o InStr jak o czytaniu zdania od lewej do prawej, znak po znaku.
Funkcja zaczyna od string1, przeszukuje go i szuka pierwszego miejsca, w którym pasuje string2. W momencie znalezienia dopasowania zatrzymuje się i zwraca pozycję, na której się ono zaczyna.
Pozycja „dopasowania” jest ważna, ponieważ VBA liczy od 1, a nie od 0. Czyli pierwszy znak w łańcuchu to pozycja 1, drugi to 2 itd.
Wartości zwracane przez VBA InStr — wyjaśnienie
Interpretacja wyniku funkcji InStr jest prosta. Możesz otrzymać jedno z poniższych:
-
Liczba dodatnia: jeśli znajdzie dopasowanie, liczba mówi, gdzie się zaczyna.
-
0: jeśli nie ma dopasowania nigdzie w łańcuchu
Jeśli jednak twoje wejściowe łańcuchy to Null, funkcja zwraca Null. Przy prostych makrach możesz to zignorować, ale warto pamiętać, że ta różnica może po cichu zepsuć warunek.
Podstawowe przykłady VBA InStr
Teraz pokażę ci kilka przykładów użycia funkcji VBA InStr.
Znajdź słowo w zdaniu
Aby sprawdzić, czy słowo „before” znajduje się w notatce „Deliver before noon”.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Wynik powyższego VBA to 9, ponieważ „before” zaczyna się od 9. znaku.
Sprawdź, czy znak istnieje
Aby sprawdzić, czy znak „0” istnieje w danym łańcuchu, użyj VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
W tym przypadku dowolny wynik większy niż 0 oznacza, że znak został znaleziony.
Szukaj od początku łańcucha
Aby szukać od początku łańcucha, nie musisz podawać pozycji startowej, więc zaczyna od 1. To domyślne zachowanie za każdym razem, chyba że powiesz inaczej.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Jak używać VBA InStr w instrukcjach If
Pracując z prawdziwym arkuszem, nie szukasz tylko liczby; chcesz podjąć decyzję. Najczęstszy sposób użycia InStr to wewnątrz instrukcji If, aby filtrować dane.
W całym tym tutorialu użyjemy przykładowego zbioru danych Orders z kolumnami: ID, CustomerName, Email, City i OrderNotes.
If InStr(...) > 0 Then
Ponieważ InStr zwraca 0, gdy niczego nie znajdzie, sprawdzamy, czy wynik istnieje, gdy zwróci liczbę większą niż 0.
W poniższym przykładzie sprawdzana jest kolumna OrderNotes (kolumna 5). Jeśli znajdzie słowo „Fragile”, zapisuje „Handle Carefully” w kolumnie 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Warunkowe sprawdzanie słów kluczowych i filtrowanie tekstu
Możesz też użyć funkcji InStr do sprawdzania słów kluczowych w łańcuchach, zwłaszcza gdy fraza nieco się zmienia. Na przykład poniższy kod sprawdza, czy notatka zawiera „Call” (jak „Call on arrival” albo „Call before delivery”). Następnie oznacza i dodaje tag „Cal Customer” w kolumnie 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
Czułość na wielkość liter i tryby compare w VBA InStr
Domyślnie InStr rozróżnia wielkość liter (tzw. vbBinaryCompare). Załóżmy, że szukasz „chicago”, ale w danych jest „Chicago” — InStr zwróci 0.
Aby to naprawić, użyj argumentu compare, gdzie:
-
vbBinaryCompare(domyślne): z rozróżnianiem wielkości liter („A” to nie to samo co „a”). -
vbTextCompare: bez rozróżniania wielkości liter — „A” to to samo co „a”.
W przykładzie poniżej InStr zwraca 0, ponieważ szuka „fragile” (małymi literami) w „Fragile items”.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Natomiast użycie vbTextCompare zwraca 1 dla tego samego wyszukiwania, ignorując wielkość liter.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr z pozycją startową
Czasem nie chcesz zaczynać wyszukiwania od początku łańcucha. Argument start mówi VBA, gdzie zacząć szukanie.
W przykładzie poniżej argument start ustawiono na 10, więc VBA zaczyna wyszukiwanie od 10. znaku zamiast od pierwszego. Następnie znajduje "delivery" dalej w łańcuchu.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Wynik powyższego przykładu to 31, czyli pozycja, od której zaczyna się "delivery".
Ta metoda przydaje się, gdy chcesz drugie wystąpienie czegoś lub chcesz zignorować znany prefiks przy pracy z powtarzalnymi wzorcami.
VBA InStr vs. InStrRev
Jak już wiesz, InStr szuka od lewej do prawej. Natomiast InStrRev szuka od prawej do lewej.
Na przykład użyliśmy InStrRev, aby znaleźć ostatnią kropkę w adresie e‑mail. Wynik to 18, czyli pozycja kropki przed „com”.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev bywa bardziej przydatny, gdy potrzebujesz ostatniego wystąpienia czegoś lub gdy pracujesz z nazwami plików, e‑mailami albo ścieżkami.
Typowe zastosowania VBA InStr
Skoro już zobaczyliśmy przykłady działania funkcji VBA InStr, przyjrzyjmy się typowym zastosowaniom.
Sprawdź, czy komórka zawiera słowo kluczowe
Załóżmy, że masz zbiór zamówień klientów i musisz oznaczyć zamówienia do specjalnej obsługi. Kod sprawdza kolumnę OrderNotes i oznacza wszystko z „noon”.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
Walidacja tekstu w stylu e‑mail
Możesz też użyć funkcji InStr, aby szybko sprawdzić poprawność formatu e‑mail. Na przykład poniższy kod sprawdza, czy e‑mail zawiera @ i zwraca „Valid Email Format” w kolumnie 6.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Wykrywanie separatorów, jak przecinki czy łączniki
Możesz użyć funkcji InStr, by sprawdzić, czy w tekście występuje łącznik, przecinek lub ukośnik. W przykładzie poniżej kod przechodzi przez OrderNotes (kolumna E), sprawdza, czy w tekście jest przecinek, a następnie zapisuje wynik w kolumnie F.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Częste błędy z VBA InStr
Nawet jako doświadczony deweloper możesz napotkać problemy z funkcją InStr, które sprawiają, że kod zachowuje się nieoczekiwanie. Oto typowe kwestie, na które trafiałem, oraz jak je rozwiązać:
-
Zapominanie, że InStr jest 1‑indeksowane: Zawsze pamiętaj, że pozycje zaczynają się od 1, nie od 0. Jeśli przychodzisz z Pythona lub JavaScriptu, na początku może to wydawać się nienaturalne.
-
Traktowanie InStr jak True/False: Pamiętaj, że
InStrnie zwracaTrueaniFalse. Jeśli chcesz coś znaleźć, musisz sprawdzić, czy wynik jest> 0. -
Ignorowanie wielkości liter: Jak już wiesz,
InStrdomyślnie rozróżnia wielkość liter. Jeśli wielkość nie ma znaczenia, zaznacz to przezvbTextComparew argumenciecompare. -
Pomylenie string1 i string2: Zawsze pamiętaj, że pierwszy argument to miejsce, w którym szukasz. Drugi to to, czego szukasz. Jeśli wyszukujesz tak:
InStr(SearchTerm, FullText), zawsze otrzymasz0.
VBA InStr a inne funkcje tekstowe VBA
Ponieważ InStr zwykle pokazuje, gdzie w tekście znajduje się łańcuch, porównajmy go z innymi funkcjami tekstowymi.
InStr vs. Like
Operator Like służy do dopasowywania wzorców. Na przykład poniższy kod sprawdza „Fragile”, ale używa wzorca *, co oznacza „cokolwiek przed lub po”.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Użyj InStr, gdy po prostu musisz wiedzieć, czy tekst istnieje, a Like wtedy, gdy chcesz sprawdzić tekst względem złożonych wzorców.
InStr vs. Replace
Choć możesz użyć InStr, by zmienić całą wartość w komórce, funkcja Replace zmienia konkretny tekst w komórce.
W przykładzie poniżej funkcja Replace bezpośrednio podmienia „Fragile” na „Handle Carefully” w tekście.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr vs. Mid
Funkcja Mid służy do wyodrębniania tekstu z łańcucha. Dlatego często użyjesz Mid razem z InStr, by wyciągnąć tekst po uzyskaniu jego pozycji.
Poniższy kod wyciąga domenę z e‑maili w zbiorze danych. Funkcja InStr znajduje, gdzie w e‑mailu pojawia się „@”, a potem Mid zaczyna ekstrakcję po nim. Na końcu kod zapisuje domenę do kolumny H.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr vs.Split
Funkcja Split służy do podziału tekstu na części według zadanego separatora.
W przykładzie poniżej kod odczytuje każdy wiersz z kolumny A, sprawdza, czy jest przecinek, a następnie dzieli tekst na dwie części. Zapisuje Name → kolumna B oraz City → kolumna C.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Only split if a comma exists
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
Najlepsze praktyki korzystania z VBA InStr
Aby uniknąć błędów w VBA, polecam następujące praktyki, które oszczędziły mi sporo czasu:
-
Używaj vbTextCompare, gdy wielkość liter nie ma znaczenia: Ponieważ większość prawdziwych danych nie jest spójna pod względem wielkości liter, możesz przegapić dopasowania, jeśli polegasz na domyślnym argumencie porównania.
-
Łącz z „If” dla czytelnej logiki: Zawsze staraj się dodać logikę zwracającą wartość, bo samo
InStrdaje ci tylko liczbę. -
Sprawdzaj > 0, a nie dokładne pozycje, chyba że faktycznie potrzebujesz pozycji.
-
Zachowaj czytelność parsowania. Nie układaj zbyt wielu funkcji w jednej linii.
Podsumowanie
InStr jest prosta, ale będziesz używać jej wszędzie. Daje ci pozycję jednego łańcucha w drugim, a ta jedna liczba napędza wiele decyzji w VBA: czy coś istnieje, skąd wyciągać i co makro powinno zrobić dalej. Sama w sobie to tylko wyszukiwanie. Połączona z funkcjami takimi jak Mid, Replace czy nawet Split staje się częścią przepływu pracy, który faktycznie wykonuje zadania.
Weź udział w kursie Data Analysis in Excel, by opanować zaawansowaną analitykę. Weź też udział w kursie Intermediate Power Query in Excel, aby poznać transformację danych i język M.
FAQs
Co tak naprawdę zwraca InStr?
Zwraca pozycję, od której zaczyna się dopasowanie. Jeśli nic nie zostanie znalezione, zwraca 0.
Czy InStr rozróżnia wielkość liter?
Tak, InStr domyślnie rozróżnia wielkość liter. ”Fragile” i ”fragile” są traktowane jako różne. Użyj vbTextCompare, jeśli nie chcesz porównania z rozróżnianiem wielkości liter.
Co oznacza, że InStr jest 1‑indeksowane?
Pierwszy znak w łańcuchu ma pozycję 1, a nie 0. Ma to znaczenie, gdy używasz wyniku w innych funkcjach.
Co się stanie, jeśli jedna z wartości to Null?
Wynik również będzie Null, a nie 0.
Jaka jest różnica między InStr a InStrRev?
InStr szuka od lewej do prawej, a InStrRev zaczyna od prawej do lewej. Użyj tej drugiej, gdy liczy się ostatnie wystąpienie.