Hàm SEARCH trong Excel có nhiều khả năng hơn việc chỉ tìm vị trí một ký tự. Hầu hết người dùng chỉ biết cú pháp cơ bản =SEARCH(“text”, A1) để tìm chuỗi đơn giản. Nhưng hàm này hỗ trợ ký tự đại diện, có thể lồng vào nhau, và kết hợp với các hàm khác để xử lý dữ liệu phức tạp chỉ trong một công thức.

Dùng ký tự đại diện để tìm kiếm linh hoạt
Tìm nhiều biến thể cùng lúc thay vì viết nhiều công thức
Ký tự đại diện biến hàm SEARCH thành công cụ tìm kiếm mạnh mẽ. Dấu chấm hỏi (?) thay thế một ký tự bất kỳ, còn dấu sao (*) đại diện cho bất kỳ chuỗi ký tự nào. Khác với hàm FIND, SEARCH hỗ trợ đầy đủ wildcard characters.
Cách sử dụng:
Giả sử bạn có danh sách mã sản phẩm như “PXA001”, “PXB002”, “PYC003” trong cột A. Để tìm tất cả mã bắt đầu với “PX” theo sau bởi một ký tự bất kỳ:
=SEARCH("PX?", A1)
Công thức này trả về vị trí bắt đầu của “PXA” hoặc “PXB” nhưng bỏ qua “PYC” vì ký tự thứ ba không khớp. Nếu muốn tìm bất kỳ chuỗi nào chứa “PX” ở đầu kèm theo các ký tự khác:
=SEARCH("PX*", A1)
Điều này khớp với “PXA001” và cả “PXTEST123” vì dấu sao (*) chấp nhận bất kỳ chuỗi nào sau “PX”.
Ứng dụng thực tế:
Tôi sử dụng wildcard để lọc email. Thay vì viết nhiều công thức riêng cho gmail.com, googlemail.com, và các domain khác, một công thức =SEARCH(“@g“, A1) tìm được tất cả các địa chỉ chứa “g” trong domain. Điều này giảm số lượng công thức từ 5 xuống còn 1.
Để tìm số điện thoại theo format “(0xx) xxx-xxxx”, dùng:
=SEARCH("(0??) ???-????", A1)
Mỗi dấu hỏi đại diện chính xác một chữ số, giúp validate format mà không cần regex phức tạp.
Kết hợp với ISNUMBER để kiểm tra sự xuất hiện
Biến SEARCH thành công cụ kiểm tra có/không
Hàm SEARCH trả về lỗi #VALUE! khi không tìm thấy chuỗi. Thay vì xử lý lỗi bằng IFERROR, kết hợp ISNUMBER với SEARCH để tạo công thức kiểm tra đơn giản trả về TRUE/FALSE.
Công thức cơ bản:
=ISNUMBER(SEARCH("keyword", A1))
Nếu “keyword” tồn tại trong ô A1, công thức trả về TRUE. Nếu không, trả về FALSE. Không cần IFERROR hay các hàm phức tạp khác.
Ví dụ nâng cao:
Kiểm tra email có phải từ các domain cụ thể:
=ISNUMBER(SEARCH("@gmail", A1)) + ISNUMBER(SEARCH("@yahoo", A1))
Công thức này trả về 1 nếu tìm thấy một trong hai domain, 0 nếu không. Dùng với IF để phân loại:
=IF(ISNUMBER(SEARCH("@gmail", A1)), "Gmail", IF(ISNUMBER(SEARCH("@yahoo", A1)), "Yahoo", "Khác"))
Trong một dự án với 3000 dòng dữ liệu email, phương pháp này phân loại trong 2 giây thay vì filter thủ công 15 phút. ISNUMBER-SEARCH không phân biệt chữ hoa/thường, nên “@Gmail” và “@gmail” đều được nhận diện.
Kết hợp với SUMIF:
Đếm số lượng sản phẩm có từ “Premium”:
=SUMPRODUCT(--ISNUMBER(SEARCH("Premium", A2:A100)))
Công thức này quét 99 ô và đếm số ô chứa “Premium” ở bất kỳ vị trí nào trong chuỗi.
Tìm lần xuất hiện thứ hai với nested SEARCH
Xác định vị trí chính xác của ký tự lặp lại
Hàm SEARCH mặc định tìm lần xuất hiện đầu tiên. Để tìm lần xuất hiện thứ hai, thứ ba, sử dụng tham số start_num kết hợp với SEARCH lồng nhau.
Phương pháp:
Giả sử ô A1 chứa “[email protected]”. Để tìm vị trí dấu chấm thứ hai:
=SEARCH(".", A1, SEARCH(".", A1) + 1)
Cách hoạt động:
- SEARCH(“.”, A1) tìm dấu chấm đầu tiên, trả về vị trí 5
- +1 bắt đầu tìm kiếm từ vị trí 6
- SEARCH bên ngoài tìm dấu chấm tiếp theo
Kết quả: vị trí 9 (dấu chấm trong “.com”).
Ứng dụng trích xuất domain:
=MID(A1, SEARCH("@", A1) + 1, SEARCH(".", A1, SEARCH("@", A1)) - SEARCH("@", A1) - 1)
Công thức này trích xuất “example” từ email. Nó tìm @ đầu tiên, sau đó tìm dấu chấm đầu tiên sau @, rồi lấy chuỗi ở giữa.
Tìm lần xuất hiện thứ ba:
Đối với đường dẫn file “C:\Users\Documents\file.txt”, tìm dấu gạch chéo ngược thứ ba:
=SEARCH("\", A1, SEARCH("\", A1, SEARCH("\", A1) + 1) + 1)
Nested SEARCH như này có thể đi tới 4-5 cấp, nhưng sau 3 cấp nên cân nhắc VBA hoặc Power Query cho dễ đọc.
Khi xử lý 500 đường dẫn file, phương pháp nested SEARCH giúp tôi trích xuất tên thư mục chính xác trong 5 giây thay vì split text thủ công từng dòng.
Trích xuất chuỗi giữa hai ký tự với MID
Lấy chính xác phần dữ liệu cần thiết
Kết hợp SEARCH với MID cho phép trích xuất bất kỳ phần nào của chuỗi dựa trên vị trí ký tự xác định. Đây là cách thay thế mạnh mẽ cho Text to Columns khi bạn cần công thức động.
Cấu trúc cơ bản:
=MID(text, SEARCH(start_char, text) + 1, SEARCH(end_char, text) - SEARCH(start_char, text) - 1)
Giải thích từng phần:
- MID(text, start, length) – Hàm trích xuất
- SEARCH(start_char) + 1 – Vị trí bắt đầu (bỏ qua ký tự đầu)
- SEARCH(end_char) – SEARCH(start_char) – 1 – Độ dài chuỗi cần lấy
Ví dụ thực tế:
Từ chuỗi “User: johnsmith (Active)” trong ô A1, trích xuất tên người dùng:
=MID(A1, SEARCH(": ", A1) + 2, SEARCH(" (", A1) - SEARCH(": ", A1) - 2)
Kết quả: “johnsmith”
Công thức tìm vị trí sau “: ” (cộng 2 để bỏ cả dấu hai chấm và khoảng trắng), sau đó tính độ dài đến trước ” (“.
Trích xuất số điện thoại:
Từ “Contact: +84-123-456-789 (Mobile)”, lấy số điện thoại:
=MID(A1, SEARCH("+", A1), SEARCH(" (", A1) - SEARCH("+", A1))
Kết quả: “+84-123-456-789”
Xử lý nhiều dòng cùng lúc:
Khi tôi nhận file CSV với 2000 dòng dữ liệu có format “SKU: ABC123 | Price: $45.99 | Stock: 12”, tôi dùng ba công thức MID-SEARCH song song:
- Cột B: Trích SKU
- Cột C: Trích Price
- Cột D: Trích Stock
Mỗi công thức tự động điều chỉnh theo độ dài dữ liệu thực tế. Toàn bộ quá trình tách dữ liệu hoàn thành trong 3 giây so với 20 phút nếu dùng Text to Columns thủ công.
Lưu ý về hiệu suất:
MID-SEARCH tái tính mỗi khi sheet thay đổi. Với file lớn hơn 5000 dòng, sau khi trích xuất nên copy và paste values để tăng tốc độ.
Tìm ký tự đặc biệt với dấu ngã
*Xử lý các trường hợp có ?, , ~ trong dữ liệu
Khi dữ liệu chứa dấu hỏi hoặc dấu sao thật sự (không phải wildcard), dấu ngã (~) buộc SEARCH xử lý chúng như ký tự thông thường. Không có escape character này, SEARCH sẽ hiểu sai ý nghĩa.
Syntax:
=SEARCH("~?", A1) ' Tìm dấu hỏi thật
=SEARCH("~*", A1) ' Tìm dấu sao thật
=SEARCH("~~", A1) ' Tìm dấu ngã thật
Dấu ngã đi trước ký tự đặc biệt báo cho Excel biết đây là ký tự literal, không phải wildcard.
Ví dụ thực tế:
Danh sách câu hỏi trong ô A1: “What is AI? How does it work?”. Tìm vị trí dấu hỏi đầu tiên:
=SEARCH("~?", A1)
Trả về vị trí 12 (vị trí dấu hỏi sau “AI”).
Nếu không dùng dấu ngã:
=SEARCH("?", A1)
Công thức này trả về 1 vì dấu hỏi là wildcard khớp với ký tự đầu tiên “W”.
Tìm trong tên file:
Tên file Windows không được chứa dấu sao, nhưng trong mô tả hoặc metadata có thể có. Từ chuỗi “Report*Final.xlsx (Draft)”, tìm vị trí dấu sao:
=SEARCH("~*", A1)
Kết quả: vị trí 7
Kết hợp với wildcard thông thường:
Tìm bất kỳ từ nào kết thúc bằng dấu hỏi trong văn bản:
=SEARCH("*~?", A1)
Công thức này tìm chuỗi bất kỳ (*) kết thúc bằng dấu hỏi literal (~?).
Trường hợp đặc biệt:
Trong một dự án phân tích feedback khách hàng, 15% bình luận chứa emoji và ký tự đặc biệt như “Product name*** (5 stars)”. Để đếm số lượng review có rating (đánh dấu bằng dấu sao), tôi dùng:
=LEN(A1) - LEN(SUBSTITUTE(SUBSTITUTE(A1, "~*", ""), "*", ""))
Đây là cách đếm số dấu sao bằng cách loại bỏ escape sequence trước.
Kết hợp nhiều technique để xử lý dữ liệu phức tạp
Năm kỹ thuật trên có thể kết hợp để tạo công thức mạnh mẽ xử lý các tình huống thực tế phức tạp. Ví dụ, từ log file có format “2025-10-12 14:30:45 [ERROR] Connection timeout (Server: db01.example.com)”, trích xuất thông tin server:
=MID(A1, SEARCH("Server: ", A1) + 8, SEARCH(")", A1, SEARCH("Server: ", A1)) - SEARCH("Server: ", A1) - 8)
Công thức này:
- Tìm vị trí “Server: ” với SEARCH đầu tiên
- Bắt đầu trích xuất từ sau “Server: ” (+8 để bỏ 8 ký tự “Server: “)
- Tìm dấu ngoặc đóng sau vị trí “Server: ” bằng nested SEARCH
- Tính độ dài cần trích xuất
Kết quả: “db01.example.com”
Hàm SEARCH hoạt động trên Excel 2007 trở lên, bao gồm Excel 365. Khác với FIND phân biệt chữ hoa chữ thường, SEARCH coi “text” và “TEXT” như nhau. Nếu cần phân biệt case-sensitive, chuyển sang hàm FIND. Các kỹ thuật wildcard và nested SEARCH đặc biệt hữu ích khi xử lý dữ liệu không chuẩn hoặc có format thay đổi. Với dữ liệu lớn hơn 10000 dòng, cân nhắc Power Query cho hiệu suất tốt hơn.
