Chuyển đến nội dung chính

Hàm VBA InStr: Cách tìm kiếm văn bản trong Excel VBA

Tìm hiểu cách dùng hàm VBA InStr để tìm văn bản trong chuỗi, bao gồm cú pháp, ví dụ, phân biệt hoa/thường và các lỗi thường gặp.
Đã cập nhật 21 thg 9, 2026  · 9 phút đọc

Khám phá với AI

ChatGPTClaudePerplexity

Nếu bạn đã viết hơn vài macro VBA, có lẽ bạn đã gặp tình huống cần kiểm tra xem một đoạn văn bản có tồn tại trong ô hay không. Trong VBA, InStr là một trong những hàm bạn sẽ dùng ở khắp nơi. Nó cho biết vị trí một đoạn văn bản xuất hiện bên trong đoạn khác. Bạn có thể dùng nó để kiểm tra văn bản có tồn tại trong ô, phân tách giá trị trong chuỗi văn bản hoặc điều khiển logic điều kiện trong các macro phụ thuộc vào mẫu văn bản.

Trong hướng dẫn này, tôi sẽ giới thiệu cú pháp InStr, một vài ví dụ, cách các chế độ so sánh hoạt động (phần này thường gây nhầm lẫn hơn mức cần thiết), và một số mẫu bạn sẽ thực sự tái sử dụng.

Tôi khuyên bạn bắt đầu với lộ trình kỹ năng Excel Fundamentals của chúng tôi để xây nền tảng vững chắc trước khi học VBA, hoặc tham gia khóa Advanced Excel Functions nếu bạn đã có chút kinh nghiệm để học thêm về cách các hàm cải thiện hiệu quả trong phân tích dữ liệu.

Hàm VBA InStr là gì?

InStr là một hàm VBA trả về vị trí lần xuất hiện đầu tiên của một chuỗi bên trong chuỗi khác.

Kết quả hoạt động như sau:

  • Nếu tìm thấy, trả về một số (vị trí nơi bắt đầu khớp)
  • Nếu không tìm thấy gì, trả về 0

Ví dụ, nếu “cat” xuất hiện tại vị trí 5 trong một chuỗi, bạn nhận được 5. Nếu không có, bạn nhận được 0.

Cú pháp VBA InStr

Đây là cú pháp đầy đủ của InStr:

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

Trong đó:

  • start (tùy chọn): Cho VBA biết bắt đầu tìm từ đâu. Nếu bỏ qua, VBA sẽ bắt đầu từ vị trí 1.

  • string1 (bắt buộc): Toàn bộ văn bản bạn cần tìm bên trong.

  • string2 (bắt buộc): Đoạn văn bản bạn cần tìm.

  • compare (tùy chọn): Xác định cách so sánh (phân biệt hoa/thường hay không). Nếu bỏ trống, VBA dùng chế độ so sánh mặc định, thường là phân biệt hoa/thường.

Lưu ý bạn có thể bỏ qua đối số startcompare (InStr(string1, string2)) cho phiên bản đơn giản hơn. Nhưng nếu dùng đối số compare, bạn cũng phải cung cấp đối số start.

Cách thức hoạt động của VBA InStr

Hãy hình dung InStr như đọc một câu từ trái sang phải, từng ký tự một.

Hàm bắt đầu với string1, quét qua và tìm vị trí đầu tiên nơi string2 khớp. Ngay khi tìm thấy, nó dừng lại và trả về vị trí nơi bắt đầu khớp.

Vị trí “khớp” rất quan trọng vì VBA đếm từ 1, không phải 0. Vậy nên ký tự đầu tiên trong chuỗi là vị trí 1, ký tự thứ hai là 2, v.v.

Giải thích giá trị trả về của VBA InStr

Diễn giải kết quả của hàm InStr rất đơn giản. Bạn sẽ nhận một trong các kết quả sau:

  • Số dương: Nếu tìm thấy khớp, con số cho biết vị trí bắt đầu.

  • 0: Nếu không có khớp nào trong chuỗi

Tuy nhiên, nếu chuỗi đầu vào của bạn là Null, hàm trả về Null. Dù bạn có thể bỏ qua điều này với các macro cơ bản, cũng đáng lưu ý vì khác biệt này có thể âm thầm làm sai điều kiện.

Ví dụ cơ bản về VBA InStr

Giờ tôi sẽ minh họa vài ví dụ cách dùng hàm VBA InStr.

Tìm một từ trong câu

Kiểm tra xem từ “before” có trong ghi chú “Deliver before noon”.

Sub Before()

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

End Sub

Kết quả của VBA trên là 9 vì “before” bắt đầu tại ký tự thứ 9.

Kiểm tra sự tồn tại của một ký tự

Để kiểm tra ký tự “0” có tồn tại trong một chuỗi cho trước, dùng VBA:

Sub ChExist()

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

End Sub

Trong trường hợp này, bất kỳ kết quả nào lớn hơn 0 nghĩa là đã tìm thấy ký tự đó.

Tìm kiếm từ đầu chuỗi

Để tìm kiếm từ đầu chuỗi, bạn không cần chỉ định vị trí bắt đầu, nên mặc định sẽ là 1. Đó là mặc định mọi lúc trừ khi bạn nói khác.

Sub ChExist()

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

End Sub

Cách dùng VBA InStr trong câu lệnh If

Khi làm việc với bảng tính thực tế, bạn không chỉ tìm một con số; bạn đang cần đưa ra quyết định. Cách phổ biến nhất để dùng InStr là trong câu lệnh If để lọc dữ liệu.

Xuyên suốt hướng dẫn, chúng ta sẽ dùng một bộ dữ liệu mẫu, Orders, với các cột: ID, CustomerName, Email, CityOrderNotes.

If InStr(...) > 0 Then

InStr trả về 0 khi không tìm thấy gì, ta kiểm tra xem có kết quả khi nó trả về số lớn hơn 0 hay không.

Trong ví dụ dưới đây, nó xem cột OrderNotes (cột 5). Nếu tìm thấy từ “Fragile”, nó ghi “Handle Carefully” vào cột 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

Kiểm tra điều kiện theo từ khóa và lọc văn bản

Bạn cũng có thể dùng hàm InStr để kiểm tra từ khóa trong chuỗi, đặc biệt khi cụm từ có hơi thay đổi. Ví dụ, đoạn mã dưới đây kiểm tra ghi chú có chứa “Call” (như “Call on arrival” hoặc “Call before delivery”). Sau đó nó gắn cờ và thêm thẻ “Cal Customer” vào cột 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

Phân biệt hoa/thường và chế độ so sánh của VBA InStr

Mặc định, InStr phân biệt chữ hoa/thường (gọi là vbBinaryCompare). Giả sử bạn tìm “chicago” nhưng dữ liệu là “Chicago” thì InStr sẽ trả về 0.

Để khắc phục, bạn dùng đối số compare với:

  • vbBinaryCompare (Mặc định): phân biệt hoa/thường (“A” khác “a”.)

  • vbTextCompare: không phân biệt hoa/thường “A” giống “a”.

Trong ví dụ dưới, InStr trả về 0 vì tìm “fragile” (chữ thường) trong “Fragile items”.

Sub CheckFragile()

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

End Sub

Tuy nhiên, dùng vbTextCompare sẽ trả về 1 với cùng phép tìm kiếm vì bỏ qua phân biệt hoa/thường.

Sub CheckFragile()

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

End Sub

VBA InStr với vị trí bắt đầu

Đôi khi bạn không muốn bắt đầu tìm từ đầu chuỗi. Đối số start cho VBA biết nên bắt đầu tìm kiếm từ đâu.

Trong ví dụ dưới, đối số start đặt là 10, nên VBA bắt đầu tìm từ ký tự thứ 10 thay vì đầu tiên. Sau đó nó tìm thấy "delivery" ở phần sau của chuỗi.

Sub CheckUrgent()

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

End Sub

Kết quả của ví dụ trên là 31, tức vị trí nơi "delivery" bắt đầu.

Cách này hữu ích khi bạn muốn lần xuất hiện thứ hai của gì đó hoặc bỏ qua một tiền tố đã biết khi làm việc với mẫu lặp lại.

VBA InStr so với InStrRev

Như bạn đã biết, InStr tìm kiếm từ trái sang phải. Còn InStrRev tìm từ phải sang trái.

Ví dụ, chúng ta dùng InStrRev để tìm dấu chấm cuối cùng trong email. Kết quả là 18, tức vị trí của dấu chấm trước “com”.

Sub CheckChr()

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

End Sub

Bạn sẽ thấy InStrRev hữu dụng hơn khi cần lần xuất hiện cuối cùng của gì đó hoặc khi làm việc với tên tệp, email hay đường dẫn.

Các trường hợp sử dụng thường gặp của VBA InStr

Sau khi đã xem ví dụ cách hàm VBA InStr hoạt động, hãy xem các trường hợp sử dụng phổ biến.

Kiểm tra ô có chứa từ khóa

Giả sử bạn có bộ dữ liệu đơn hàng khách hàng và cần gắn cờ đơn cần xử lý đặc biệt. Mã sẽ xem cột OrderNotes và gắn cờ bất cứ gì có “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

Xác thực văn bản kiểu email

Bạn cũng có thể dùng hàm InStr để nhanh chóng kiểm tra định dạng email hợp lệ. Ví dụ, mã dưới đây kiểm tra email có chứa @ và ghi “Valid Email Format” vào cột 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

Phát hiện dấu phân tách như dấu phẩy hoặc gạch nối

Bạn có thể dùng hàm InStr để kiểm tra xem dấu gạch nối, dấu phẩy hoặc dấu gạch chéo có tồn tại trong văn bản không. Trong ví dụ dưới đây, mã lặp qua OrderNotes (cột E), kiểm tra có dấu phẩy trong văn bản hay không, rồi ghi kết quả vào cột 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

Các lỗi thường gặp với VBA InStr

Ngay cả khi là nhà phát triển có kinh nghiệm, bạn có thể gặp trục trặc với hàm InStr khiến mã hoạt động không như mong đợi. Dưới đây là các vấn đề phổ biến tôi từng gặp và cách bạn có thể giải quyết:

  • Quên rằng InStr đếm từ 1: Luôn nhớ vị trí bắt đầu từ 1, không phải 0. Nếu bạn quen với Python hoặc JavaScript, ban đầu sẽ hơi lạ.

  • Xem InStr như True/False: Hãy nhớ InStr không trả về True hay False. Nếu muốn biết có tìm thấy gì không, bạn phải kiểm tra kết quả > 0.

  • Bỏ qua phân biệt hoa/thường: Như bạn đã biết, InStr mặc định phân biệt hoa/thường. Nếu không quan tâm đến hoa/thường, hãy chỉ định vbTextCompare trong đối số compare.

  • Nhầm lẫn giữa string1 và string2: Luôn nhớ đối số đầu tiên là nơi bạn tìm kiếm. Đối số thứ hai là thứ bạn đang tìm. Nếu bạn tìm như InStr(SearchTerm, FullText), bạn sẽ luôn nhận 0.

VBA InStr so với các hàm chuỗi khác trong VBA

InStr thường cho biết vị trí một chuỗi trong văn bản, hãy so sánh nó với các hàm chuỗi khác.

InStr so với Like

Toán tử Like dùng để khớp mẫu. Ví dụ, mã dưới đây kiểm tra “Fragile”, nhưng dùng mẫu *, nghĩa là “bất kỳ thứ gì trước hoặc sau”.

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

Dùng InStr nếu bạn chỉ cần biết văn bản có tồn tại hay không, và dùng Like khi cần kiểm tra văn bản theo mẫu phức tạp.

InStr so với Replace

Mặc dù bạn có thể dùng InStr để thay đổi toàn bộ giá trị trong ô, hàm Replace thay đổi phần văn bản cụ thể trong ô.

Trong ví dụ dưới đây, hàm Replace thay thế trực tiếp “Fragile” bằng “Handle Carefully” trong văn bản.

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 so với Mid

Hàm Mid dùng để trích xuất văn bản từ chuỗi. Do đó, bạn sẽ thường dùng Mid cùng với InStr để trích xuất văn bản sau khi có vị trí.

Đoạn mã dưới đây trích xuất tên miền từ email trong bộ dữ liệu. Hàm InStr tìm vị trí "@" trong email, sau đó Mid bắt đầu trích xuất sau ký tự đó. Mã kết thúc bằng cách ghi tên miền vào cột 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 so với Split

Hàm Split dùng để tách văn bản thành các phần bằng cách chỉ định ký tự phân tách.

Trong ví dụ dưới đây, mã đọc từng hàng từ cột A, kiểm tra có dấu phẩy, rồi tách văn bản thành hai phần. Nó ghi Name → cột B và City → cột 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

Thực hành tốt nhất khi dùng VBA InStr

Để tránh lỗi trong VBA, tôi khuyến nghị các thực hành tốt sau, đã giúp tôi tiết kiệm thời gian:

  • Dùng vbTextCompare khi không quan tâm hoa/thường: Vì hầu hết dữ liệu thực tế không nhất quán về chữ hoa/thường, bạn có thể bỏ sót khớp nếu dựa vào đối số so sánh mặc định.

  • Kết hợp với “If” để có logic rõ ràng: Luôn cố gắng đưa vào logic trả về giá trị, vì InStr tự thân chỉ cho bạn một con số.

  • Kiểm tra > 0, không phải vị trí chính xác, trừ khi bạn thực sự cần vị trí.

  • Giữ việc phân tách dễ đọc. Đừng xếp chồng quá nhiều hàm trên một dòng.

Kết luận

InStr đơn giản, nhưng bạn sẽ dùng nó ở khắp nơi. Nó cho bạn vị trí của một chuỗi bên trong chuỗi khác, và con số đó chi phối nhiều quyết định trong VBA: có tồn tại hay không, trích xuất từ đâu, và macro nên làm gì tiếp theo. Tự thân, nó chỉ là tìm kiếm. Kết hợp với các hàm như Mid, Replace, hay thậm chí Split, nó trở thành một phần của quy trình giúp công việc được hoàn thành.

Tham gia khóa Data Analysis in Excel để thành thạo phân tích nâng cao. Ngoài ra, hãy tham gia khóa Intermediate Power Query in Excel để học về chuyển đổi dữ liệu và sử dụng ngôn ngữ M.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

InStr thực sự trả về gì?

Hàm trả về vị trí nơi bắt đầu khớp. Nếu không tìm thấy gì, hàm trả về 0.

InStr có phân biệt hoa/thường không?

Có, InStr mặc định phân biệt chữ hoa/thường. ”Fragile””fragile” được coi là khác nhau. Dùng vbTextCompare nếu bạn không muốn so sánh phân biệt hoa/thường.

Việc InStr đếm từ 1 có nghĩa là gì?

Ký tự đầu tiên trong chuỗi ở vị trí 1, không phải 0. Điều này quan trọng khi bạn dùng kết quả trong các hàm khác.

Điều gì xảy ra nếu một trong các giá trị là Null?

Kết quả cũng sẽ là Null, không phải 0.

Sự khác nhau giữa InStr và InStrRev là gì?

InStr tìm kiếm từ trái sang phải, trong khi InStrRev bắt đầu từ phải sang trái. Hãy dùng hàm sau khi lần xuất hiện cuối cùng là quan trọng.

Chủ đề
Excel

Học cùng DataCamp

Tracks

Cơ bản về Excel

16 giờ
Nắm vững các kỹ năng cần thiết để sử dụng Excel, từ việc chuẩn bị dữ liệu, viết công thức đến tạo biểu đồ và đồ thị. Không yêu cầu kinh nghiệm trước đó.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow