Hoppa till huvudinnehållet

VBA InStr-funktionen: Så söker du efter text i Excel VBA

Lär dig använda VBA-funktionen InStr för att hitta text i strängar, inklusive syntax, exempel, skiftlägeskänslighet och vanliga misstag.
Uppdaterad 21 sep. 2026  · 9 min läsa

Utforska med AI

ChatGPTClaudePerplexity

Om du har skrivit mer än ett par VBA-makron har du förmodligen stött på läget där du behöver kontrollera om viss text finns i en cell. I VBA är InStr en av de funktioner du använder överallt. Den talar om var en bit text förekommer i en annan. Du kan använda den för att kontrollera om text finns i en cell, tolka värden i en text eller styra villkorslogik i makron som beror på textmönster.

I den här guiden går jag igenom InStr-syntaxen, några exempel, hur jämförelselägen fungerar (den här delen ställer till det för fler än den borde) och några mönster du faktiskt kommer att återanvända.

Jag rekommenderar att du börjar med vår Excel Fundamentals-spår för att bygga en stabil grund innan du går vidare till VBA, eller gå vår kurs Advanced Excel Functions om du har lite erfarenhet, för att lära dig mer om hur funktioner ökar effektiviteten i dataanalys.

Vad är VBA-funktionen InStr?

InStr är en VBA-funktion som returnerar positionen för den första förekomsten av en sträng inuti en annan.

Resultaten beter sig så här:

  • Om en träff hittas returneras ett tal (positionen där träffen börjar)
  • Om inget hittas returneras 0

Till exempel, om ”cat” förekommer på position 5 i en sträng, får du 5. Om den inte finns där får du 0.

VBA InStr-syntax

Här är hela InStr-syntaxen:

InStr([start], string1, string2, [compare])

Där:

  • start (valfritt): Anger var VBA ska börja sökningen. Om du hoppar över det börjar VBA från position 1.

  • string1 (obligatoriskt): Hela texten du söker i.

  • string2 (obligatoriskt): Texten du försöker hitta.

  • compare (valfritt): Definierar hur jämförelsen görs (skiftlägeskänsligt eller inte). Om du utelämnar det använder VBA standardläget för jämförelse, vanligtvis skiftlägeskänsligt.

Observera att du kan ignorera argumenten start och compare (InStr(string1, string2)) för en enklare variant. Men om du väljer att använda argumentet compare måste du också ange argumentet start.

Så fungerar VBA InStr

Tänk på InStr som att läsa en mening från vänster till höger, ett tecken i taget.

Funktionen börjar med string1, skannar igenom den och letar efter den första platsen där string2 matchar. I samma ögonblick som den hittar en matchning stannar den och returnerar positionen där den började.

”Matchnings”-positionen är viktig eftersom VBA räknar från 1, inte 0. Så det första tecknet i en sträng är position 1, det andra är 2, och så vidare. 

Returnerade värden i VBA InStr förklarade

Att tolka resultatet av en InStr-funktion är rakt på sak. Du kan få något av följande:

  • Positivt tal: Om en träff hittas, och talet anger var den börjar.

  • 0: Om det inte finns någon träff någonstans i strängen

Men om dina inmatade strängar är Null returnerar funktionen Null. Även om du kan bortse från detta i enklare makron är det värt att notera att skillnaden tyst kan fälla ett villkor.

Grundläggande exempel på VBA InStr

Nu ska jag visa några exempel på hur du använder VBA-funktionen InStr

Hitta ett ord i en mening

För att kontrollera om ordet ”before” finns i anteckningen ”Deliver before noon”.

Sub Before()

    Dim result As Integer
    result = InStr("Deliver before noon", "before")
    
    MsgBox result

End Sub

Resultatet för VBA-koden ovan är 9 eftersom ”before” börjar vid det 9:e tecknet.

Kontrollera om ett tecken finns

För att kontrollera om tecknet ”0” finns i en given sträng, använd VBA:

Sub ChExist()

    Dim result As Integer
    result = InStr(“A1023”, “0”)
    
    MsgBox result

End Sub

I detta fall betyder alla resultat större än 0 att tecknet har hittats.

Sök från början av en sträng

För att söka från början av en sträng behöver du inte ange startposition, så den börjar vid 1. Det är standard varje gång om du inte säger något annat.

Sub ChExist()

    Dim result As Integer
    result = InStr("Report_2026_Final", "2026")
    
    MsgBox result

End Sub

Så använder du VBA InStr i If-satser

När du arbetar med ett riktigt kalkylblad letar du inte bara efter ett tal; du försöker fatta ett beslut. Det vanligaste sättet att använda InStr är inuti en If-sats för att filtrera data.

Genom hela den här handledningen använder vi ett exempeldataset, Orders, med kolumnerna: ID, CustomerName, Email, City och OrderNotes.

If InStr(...) > 0 Then

Eftersom InStr returnerar 0 när den inte hittar något, kontrollerar vi om resultatet finns när det returnerar ett tal större än 0.

I exemplet nedan tittar den på kolumnen OrderNotes (kolumn 5). Om den hittar ordet ”Fragile” skriver den ”Handle Carefully” i kolumn 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

Villkorskontroller för nyckelord och textfiltrering

Du kan också använda funktionen InStr för att söka efter nyckelord i strängar, särskilt om frasen varierar lite. Till exempel kontrollerar koden nedan om anteckningen innehåller ”Call” (som ”Call on arrival” eller ”Call before delivery”). Den flaggar sedan och lägger till taggen ”Cal Customer” i kolumn 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

Skiftlägeskänslighet och jämförelsepresentation i VBA InStr

Som standard är InStr skiftlägeskänslig (kallas vbBinaryCompare). Säg att du söker efter ”chicago” men datan säger ”Chicago” – InStr kommer då att returnera 0.

För att åtgärda detta använder du argumentet compare där:

  • vbBinaryCompare (standard): skiftlägeskänslig (”A” är inte samma som ”a”.)

  • vbTextCompare: inte skiftlägeskänslig – ”A” är samma som ”a”.

I exemplet nedan returnerar InStr 0 eftersom den letar efter ”fragile” (gemener) i ”Fragile items”.

Sub CheckFragile()

    Dim result As Integer
    
    result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
    
    MsgBox result

End Sub

Men med vbTextCompare returneras 1 genom samma sökning eftersom skiftläget ignoreras.

Sub CheckFragile()

    Dim result As Integer
    
    result = InStr(1, "Fragile items", "fragile", vbTextCompare)
    
    MsgBox result

End Sub

VBA InStr med startposition

Ibland vill du inte börja en sökning i början av strängen. Argumentet start talar om för VBA var sökningen ska börja.

I exemplet nedan är argumentet start satt till 10, så VBA börjar söka från det 10:e tecknet i stället för det första. Den hittar sedan "delivery" senare i strängen.

Sub CheckUrgent()

    Dim result As Integer
    
    result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
    
    MsgBox result

End Sub

Resultatet av exemplet ovan är 31, vilket är positionen där "delivery" börjar.

Den här metoden är användbar när du vill ha den andra förekomsten av något eller ignorera ett känt prefix när du arbetar med upprepade mönster.

VBA InStr vs. InStrRev

Som du redan lärt dig söker InStr från vänster till höger. InStrRev söker däremot från höger till vänster.

Till exempel har vi använt InStrRev för att hitta sista punkten i e-postadressen. Resultatet är 18, vilket är positionen för punkten före ”com”.

Sub CheckChr()

    Dim result As Integer
    
    result = InStrRev("john.jacobs@email.com", ".")
    
    MsgBox result

End Sub

Du kommer att ha mer nytta av InStrRev när du behöver den sista förekomsten av något eller när du arbetar med filnamn, e-postadresser eller sökvägar.

Vanliga användningsfall för VBA InStr

Nu när vi har tittat på exempel på hur VBA-funktionen InStr fungerar, låt oss titta på vanliga användningsfall.

Kontrollera om en cell innehåller ett nyckelord

Anta att du har ett dataset med kundbeställningar och behöver flagga beställningar för särskild hantering. Koden tittar på kolumnen OrderNotes och flaggar allt med ”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

Validera text i e-poststil

Du kan också använda funktionen InStr för att snabbt kontrollera giltiga e-postformat. Till exempel kontrollerar koden nedan om e-postadressen innehåller @ och returnerar ”Valid Email Format” i kolumn 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

Upptäcka avgränsare som kommatecken eller bindestreck

Du kan använda funktionen InStr för att kontrollera om ett bindestreck, kommatecken eller snedstreck finns i text. I exemplet nedan loopar koden genom OrderNotes (kolumn E), kontrollerar om det finns ett kommatecken i texten och skriver sedan ett resultat i kolumn 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

Vanliga misstag med VBA InStr

Även som erfaren utvecklare kan du stöta på problem med funktionen InStr som gör att koden beter sig oväntat. Nedan följer vanliga problem jag har stött på och hur du kan lösa dem:

  • Glömmer att InStr är 1-baserad: Kom alltid ihåg att positioner börjar på 1, inte 0. Om du kommer från Python eller JavaScript känns detta fel i början.

  • Behandlar InStr som True/False: Kom ihåg att InStr inte returnerar True eller False. Om du vill hitta något måste du kontrollera om resultatet är > 0.

  • Ignorerar skiftlägeskänslighet: Som du nu vet är InStr skiftlägeskänslig som standard. Om skiftläge inte spelar någon roll, säg det med vbTextCompare i argumentet compare.

  • Blandar ihop string1 och string2: Kom alltid ihåg att det första argumentet är där du söker. Det andra är vad du letar efter. Om du söker så här InStr(SearchTerm, FullText) får du alltid 0.

VBA InStr vs. andra VBA-strängfunktioner

Eftersom InStr vanligtvis visar var en sträng finns i en text, låt oss jämföra den med andra strängfunktioner.

InStr vs. Like

Operatorn Like används för mönstermatchning. Till exempel kontrollerar koden nedan efter ”Fragile”, men använder ett mönster *, vilket betyder ”vad som helst före eller efter”.

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

Använd InStr om du bara behöver veta om text finns, och Like när du behöver kontrollera text i komplexa mönster.

InStr vs. Replace

Även om du kan använda InStr för att ändra hela värdet i en cell, ändrar funktionen Replace specifik text i cellen.

I exemplet nedan byter funktionen Replace direkt ut ”Fragile” mot ”Handle Carefully” i texten.

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

Funktionen Mid används för att extrahera text från en sträng. Därför använder du ofta Mid tillsammans med InStr för att extrahera texten efter att du fått dess position. 

Koden nedan extraherar domänen från e-postadresser i datasetet. Funktionen InStr hittar var "@" förekommer i e-postadressen, sedan börjar Mid extraktionen efter den. Koden avslutas med att skriva domänen i kolumn 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

Funktionen Split används för att dela upp text i delar genom att ange en avgränsare. 

I exemplet nedan läser koden varje rad från kolumn A, kontrollerar om det finns ett kommatecken och delar sedan upp texten i två delar. Den skriver Name → kolumn B och City → kolumn 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

Bästa praxis för att använda VBA InStr

För att undvika fel i din VBA rekommenderar jag följande bästa praxis, som har hjälpt mig att spara tid:

  • Använd vbTextCompare när skiftläge inte spelar roll: Eftersom de flesta verkliga data inte är konsekventa i skiftläge kan du missa träffar om du förlitar dig på standard-argument för jämförelse.

  • Kombinera med ”If” för tydlig logik: Försök alltid inkludera logik som returnerar ett värde, eftersom InStr i sig bara ger dig ett tal.

  • Kontrollera > 0, inte exakta positioner, om du inte faktiskt behöver positionen.

  • Gör parsning läsbar. Kasta inte in för många funktioner på en rad.

Slutsats

InStr är enkel, men du kommer att använda den överallt. Den ger dig positionen för en sträng inuti en annan, och det enda talet driver många beslut i VBA: om något finns, var du ska extrahera från och vad ett makro ska göra härnäst. I sig är den bara en sökning. I kombination med funktioner som Mid, Replace eller till och med Split blir den en del av ett arbetsflöde som faktiskt får saker gjorda.

Gå vår kurs Data Analysis in Excel för att bemästra avancerad analys. Gå också vår Intermediate Power Query in Excel-kurs för att lära dig om datatransformation och hur du använder M-språket.

FAQs

Vad returnerar InStr egentligen?

Den returnerar positionen där träffen börjar. Om inget hittas returnerar den 0.

Är InStr skiftlägeskänslig?

Ja, InStr är skiftlägeskänslig som standard. ”Fragile” och ”fragile” behandlas som olika. Använd vbTextCompare om du inte vill ha en skiftlägeskänslig jämförelse.

Vad betyder det att InStr är 1-baserad?

Det första tecknet i en sträng är position 1, inte 0. Detta har betydelse när du använder resultatet i andra funktioner.

Vad händer om ett av värdena är Null?

Resultatet blir också Null, inte 0.

Vad är skillnaden mellan InStr och InStrRev?

InStr söker från vänster till höger, medan InStrRev börjar från höger till vänster. Använd den senare när den sista förekomsten är viktig.

Ämnen
Excel

Lär dig med DataCamp

track

Excel-grunderna

16 timmar
Få de viktigaste färdigheterna du behöver för att använda Excel, från att förbereda data till att skriva formler och skapa visualiseringar. Ingen tidigare erfarenhet krävs.
Se detaljerRight Arrow
Starta Kursen
Se merRight Arrow