Przejdź do głównej treści

Funkcja VBA InStr: jak wyszukiwać tekst w Excelu VBA

Naucz się używać funkcji VBA InStr do znajdowania tekstu w łańcuchach, w tym składnia, przykłady, czułość na wielkość liter i częste błędy.
Zaktualizowano 21 wrz 2026  · 9 min Czytać

Eksploruj z AI

ChatGPTClaudePerplexity

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 InStr nie zwraca True ani False. Jeśli chcesz coś znaleźć, musisz sprawdzić, czy wynik jest > 0.

  • Ignorowanie wielkości liter: Jak już wiesz, InStr domyślnie rozróżnia wielkość liter. Jeśli wielkość nie ma znaczenia, zaznacz to przez vbTextCompare w argumencie compare.

  • 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 otrzymasz 0.

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 InStr daje 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.

Tematy
Excel

Ucz się z DataCamp

Track

Podstawy Excela

16 godz.
Zdobądź niezbędne umiejętności potrzebne do korzystania z Excela — od przygotowywania danych po pisanie formuł i tworzenie wizualizacji. Nie jest wymagane wcześniejsze doświadczenie.
Zobacz szczegółyRight Arrow
Rozpocznij Kurs
Zobacz więcejRight Arrow