tracks
VBA 매크로를 몇 개만 작성해 보셨더라도, 셀 안에 특정 텍스트가 존재하는지 확인해야 하는 순간이 있었을 것입니다. VBA에서 InStr는 여기저기서 자주 쓰이게 되는 함수 중 하나입니다. 한 문자열 안에서 다른 문자열이 어디에 나타나는지 알려 줍니다. 셀에 텍스트가 있는지 확인하거나, 텍스트에서 값을 파싱하거나, 텍스트 패턴에 따라 조건부 로직을 실행하는 데 사용할 수 있습니다.
이 가이드에서는 InStr 구문, 몇 가지 예제, 비교 모드가 어떻게 동작하는지(생각보다 많은 분들이 헷갈리는 부분), 그리고 실제로 재사용하게 될 패턴들을 차근차근 살펴보겠습니다.
진도를 나가기 전에 탄탄한 기초를 다지려면 Excel Fundamentals 스킬 트랙부터 시작하시길 권합니다. 혹은 경험이 있으시다면 Advanced Excel Functions 과정을 수강해 함수가 데이터 분석 효율을 어떻게 높이는지 더 알아보세요.
VBA InStr 함수란?
InStr는 한 문자열 안에서 다른 문자열이 최초로 나타나는 위치를 반환하는 VBA 함수입니다.
결과는 다음과 같이 동작합니다.
- 찾으면 숫자(일치가 시작되는 위치)를 반환합니다.
- 찾지 못하면 0을 반환합니다.
예를 들어 문자열의 5번째 위치에 “cat”이 나타나면 5를 얻습니다. 없다면 0을 얻습니다.
VBA InStr 구문
전체 InStr 구문은 다음과 같습니다.
InStr([start], string1, string2, [compare])
각 인수는 다음을 의미합니다.
-
start(선택): 검색을 시작할 위치입니다. 생략하면 1부터 시작합니다. -
string1(필수): 검색 대상이 되는 전체 텍스트입니다. -
string2(필수): 찾으려는 텍스트입니다. -
compare(선택): 비교 방식을 정의합니다(대소문자 구분 여부). 생략하면 VBA는 기본 비교 모드, 보통 대소문자 구분을 사용합니다.
간단히 하려면 start와 compare 인수를 생략(InStr(string1, string2))할 수 있습니다. 다만 compare 인수를 사용하려면 start 인수도 함께 제공해야 합니다.
VBA InStr 동작 방식
InStr를 왼쪽에서 오른쪽으로 한 글자씩 문장을 읽는다고 생각하면 됩니다.
함수는 string1을 시작으로 훑어보며 string2가 처음 일치하는 지점을 찾습니다. 일치 지점을 찾는 즉시 멈추고, 그 시작 위치를 반환합니다.
여기서 “일치” 위치가 중요합니다. VBA는 0이 아니라 1부터 셉니다. 따라서 문자열의 첫 글자는 1, 두 번째는 2입니다.
VBA InStr 반환 값 설명
InStr 함수 결과를 해석하는 것은 간단합니다. 다음 중 하나를 받게 됩니다.
-
양의 숫자: 일치가 있으면 그 시작 위치를 알려 줍니다.
-
0: 문자열 어디에도 일치가 없을 때
다만 입력 문자열이 Null이면 함수는 Null을 반환합니다. 기본 매크로에서는 무시할 수 있지만, 이런 차이 때문에 조건이 조용히 깨질 수 있다는 점은 알아 두어야 합니다.
기본 VBA InStr 예제
이제 VBA InStr 함수를 사용하는 몇 가지 예제를 보여 드리겠습니다.
문장 속 단어 찾기
메모 “Deliver before noon”에 “before”가 들어 있는지 확인합니다.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
위 VBA의 결과는 9입니다. “before”가 9번째 문자에서 시작하기 때문입니다.
문자 존재 여부 확인
주어진 문자열에 문자 “0”이 있는지 확인하려면 다음 VBA를 사용합니다.
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
이 경우 0보다 큰 결과는 문자를 찾았다는 의미입니다.
문자열의 처음부터 검색
문자열의 처음부터 검색하려면 시작 위치를 지정할 필요가 없습니다. 기본값은 1이며, 따로 지정하지 않는 한 항상 그렇습니다.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
If 문에서 VBA InStr 사용 방법
실제 스프레드시트 작업에서는 숫자만 찾는 게 아니라, 결정을 내리려는 것입니다. InStr를 가장 흔히 쓰는 방법은 데이터를 필터링하기 위해 If 문 안에서 사용하는 것입니다.
이 튜토리얼 전반에서 ID, CustomerName, Email, City, OrderNotes 열을 가진 예제 데이터셋 Orders를 사용합니다.
If InStr(...) > 0 Then
InStr는 아무것도 찾지 못하면 0을 반환하므로, 결과가 0보다 큰 숫자인지로 존재 여부를 확인합니다.
아래 예제에서는 OrderNotes 열(5열)을 확인합니다. “Fragile”을 찾으면 6열에 “Handle Carefully”를 기록합니다.
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
키워드 조건 검사와 텍스트 필터링
InStr 함수로 문자열의 키워드를 검사할 수도 있습니다. 특히 문구가 조금씩 달라지는 경우에 유용합니다. 예를 들어 아래 코드는 메모에 “Call”(“Call on arrival”, “Call before delivery” 등)이 포함되어 있는지 확인합니다. 그런 다음 6열에 “Cal Customer” 태그를 추가해 표시합니다.
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
VBA InStr의 대소문자 구분과 비교 모드
기본적으로 InStr는 대소문자를 구분합니다(vbBinaryCompare). 예를 들어 “chicago”를 검색했는데 데이터가 “Chicago”라면 InStr는 0을 반환합니다.
이 문제를 해결하려면 compare 인수를 사용합니다. 의미는 다음과 같습니다.
-
vbBinaryCompare(기본): 대소문자 구분(“A”는 “a”와 다릅니다.) -
vbTextCompare: 대소문자 미구분 “A”와 “a”를 동일하게 봅니다.
아래 예제에서 InStr는 “Fragile items” 안에서 “fragile”(소문자)을 찾기 때문에 0을 반환합니다.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
반면 vbTextCompare를 사용하면 대소문자를 무시하므로 같은 검색에서 1을 반환합니다.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
시작 위치와 함께 쓰는 VBA InStr
가끔은 문자열의 처음부터 검색하고 싶지 않을 때도 있습니다. start 인수는 검색을 어디서 시작할지 VBA에 알려 줍니다.
아래 예제에서는 start 인수를 10으로 설정해, 첫 글자가 아니라 10번째 문자부터 검색을 시작합니다. 이후 문자열에서 "delivery"를 찾습니다.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
위 예제의 결과는 31로, "delivery"가 시작되는 위치입니다.
이 방법은 두 번째 발생 지점을 찾거나 반복 패턴에서 알려진 접두어를 무시하고 싶을 때 유용합니다.
VBA InStr와 InStrRev 비교
이미 배운 것처럼 InStr는 왼쪽에서 오른쪽으로 검색합니다. 반면 InStrRev는 오른쪽에서 왼쪽으로 검색합니다.
예를 들어, 이메일에서 마지막 점을 찾기 위해 InStrRev를 사용했습니다. 결과는 18로, “com” 앞의 점 위치입니다.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev는 마지막 발생 지점이 필요하거나 파일 이름, 이메일, 경로를 다룰 때 더 유용합니다.
VBA InStr의 일반적인 활용 사례
이제 VBA InStr 함수의 동작 예제를 살펴봤으니, 일반적인 활용 사례를 보겠습니다.
셀에 키워드가 있는지 확인
고객 주문 데이터셋이 있고, 특정 처리 대상 주문을 표시해야 한다고 가정해 보겠습니다. 코드는 OrderNotes 열을 확인해 “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
이메일 형식 텍스트 검증
InStr 함수로 이메일 형식을 빠르게 점검할 수도 있습니다. 예를 들어 아래 코드는 이메일에 @가 포함되어 있으면 6열에 “Valid Email Format”을 기록합니다.
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
쉼표나 하이픈 같은 구분자 감지
InStr 함수로 하이픈, 쉼표, 슬래시가 텍스트에 존재하는지 확인할 수 있습니다. 아래 예제에서는 OrderNotes(E열)를 순회하며 텍스트에 쉼표가 있는지 확인한 후, 결과를 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
VBA InStr에서 흔한 실수
숙련된 개발자라도 InStr 함수 때문에 코드가 예상과 다르게 동작하는 문제를 만날 수 있습니다. 제가 겪은 흔한 이슈와 해결 방법은 다음과 같습니다.
-
InStr가 1부터 센다는 사실을 잊음: 위치는 0이 아니라 1부터 시작합니다. Python이나 JavaScript에 익숙하다면 처음엔 낯설 수 있습니다.
-
InStr를 True/False로 취급함:
InStr는True나False를 반환하지 않습니다. 찾고 싶다면 결과가> 0인지 확인해야 합니다. -
대소문자 구분을 무시함: 기본적으로
InStr는 대소문자를 구분합니다. 대소문자가 중요하지 않다면compare인수에vbTextCompare를 지정하세요. -
string1과 string2를 뒤바꿈: 첫 번째 인수는 “검색 대상”, 두 번째 인수는 “찾을 값”입니다.
InStr(SearchTerm, FullText)처럼 검색하면 항상0을 얻게 됩니다.
VBA InStr vs. 다른 VBA 문자열 함수
InStr는 보통 텍스트 내에서 문자열의 위치를 알려 줍니다. 다른 문자열 함수들과 비교해 보겠습니다.
InStr vs. Like
Like 연산자는 패턴 매칭에 사용됩니다. 예를 들어 아래 코드는 “Fragile”을 검사하되, 앞뒤에 무엇이 와도 된다는 의미의 패턴 *을 사용합니다.
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
InStr는 텍스트 존재 여부만 알면 될 때, Like는 복잡한 패턴의 텍스트를 검사해야 할 때 사용하세요.
InStr vs. Replace
InStr로 셀의 전체 값을 바꿀 수도 있지만, Replace 함수는 셀 내부의 특정 텍스트만 바꿉니다.
아래 예제에서 Replace 함수는 텍스트 안의 “Fragile”을 “Handle Carefully”로 직접 교체합니다.
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
Mid 함수는 문자열에서 텍스트를 추출하는 데 사용됩니다. 따라서 위치를 얻은 뒤 텍스트를 추출하기 위해 InStr와 Mid를 함께 사용하는 일이 많습니다.
아래 코드는 데이터셋의 이메일에서 도메인을 추출합니다. InStr 함수가 이메일에서 "@"가 나타나는 위치를 찾고, Mid가 그 다음부터 추출을 시작합니다. 마지막으로 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
Split 함수는 구분자를 지정해 텍스트를 여러 부분으로 나눕니다.
아래 예제에서 코드는 A열의 각 행을 읽고, 쉼표가 있는지 확인한 뒤 텍스트를 두 부분으로 나눕니다. Name → B열, City → 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
VBA InStr 사용 모범 사례
VBA에서 오류를 피하기 위해, 다음 모범 사례를 권장합니다. 저에게 많은 시간을 절약해 준 방법들입니다.
-
대소문자가 중요하지 않다면 vbTextCompare 사용: 실제 데이터는 대소문자가 일관되지 않은 경우가 많아, 기본 비교
인수에 의존하면 일치를 놓칠 수 있습니다. -
명확한 로직을 위해 “If”와 결합:
InStr자체는 숫자만 반환하므로, 항상 값을 반환하는 로직을 함께 포함하세요. -
> 0인지 확인하세요. 위치가 실제로 필요한 경우가 아니라면 정확한 위치 비교는 피하세요.
-
파싱 로직을 읽기 쉽게 유지하세요. 한 줄에 함수를 너무 많이 겹쳐 쓰지 마세요.
마무리
InStr는 단순하지만 결국 모든 곳에서 사용하게 됩니다. 한 문자열 안에서 다른 문자열의 위치를 알려 주고, 그 한 숫자가 VBA에서 존재 여부 판단, 추출 시작 위치, 매크로의 다음 동작 등 많은 결정을 이끕니다. 단독으로는 검색일 뿐이지만, Mid, Replace, Split 같은 함수와 결합하면 실제로 일을 처리하는 워크플로의 일부가 됩니다.
고급 분석을 마스터하려면 Data Analysis in Excel 과정을 수강해 보세요. 또한 Intermediate Power Query in Excel 과정을 통해 데이터 변환과 M 언어 사용법을 배워 보세요.
FAQs
InStr는 실제로 무엇을 반환하나요?
일치가 시작되는 위치를 반환합니다. 아무것도 찾지 못하면 0을 반환합니다.
InStr는 대소문자를 구분하나요?
네, InStr는 기본적으로 대소문자를 구분합니다. ”Fragile”과 ”fragile”은 다르게 취급됩니다. 대소문자를 구분하지 않으려면 vbTextCompare를 사용하세요.
InStr가 1 기반이라는 것은 무슨 뜻인가요?
문자열의 첫 글자 위치는 0이 아니라 1입니다. 이 점은 다른 함수와 함께 결과를 사용할 때 중요합니다.
값 중 하나가 Null이면 어떻게 되나요?
결과도 0이 아니라 Null이 됩니다.
InStr와 InStrRev의 차이는 무엇인가요?
InStr는 왼쪽에서 오른쪽으로 검색하고, InStrRev는 오른쪽에서 왼쪽으로 시작합니다. 마지막 발생 지점이 중요할 때는 후자를 사용하세요.