Hàm VBA InStr là một trong những hàm được sử dụng nhiều nhất trong Excel VBA. Nó được sử dụng để tìm một chuỗi trong chuỗi. Học Excel Online sẽ chỉ cho bạn cách sử dụng VBA INSTR cũng như cách để trích xuất chuỗi mà không cần sử dụng VBA INSTR
Xem nhanh
Chuỗi (s) | Loại | Nhiệm vụ | Cách làm |
1234ABC334 | Kích thước cố định | Sang trái 4 ký tự | Left(s,4) |
1234ABC334 | Kích thước cố định | Sang trái 3 ký tự | Right(s,3) |
1234ABC334 | Kích thước cố định | Nhận các ký tự 5,6,7 | Mid(s,5,3) |
“John Henry Smith” | Kích thước thay đổi | Lấy tên đầu tiên | Split(s,” “)(0) |
“John Henry Smith” | Kích thước thay đổi | Lấy tên thứ hai | Split(s,” “)(1) |
“John Henry Smith” | Kích thước thay đổi | Lấy tên thứ ba | Split(s,” “)(2) |
“John Henry Smith” | Kích thước thay đổi | Lấy tên cuối cùng | Dim v As Variant
v = Split(s, ” “) lastname= v(UBound(v)) |
Để tìm hiểu thêm về các mục được tham chiếu trong bài đăng, hãy xem các liên kết sau.
Nếu bạn muốn biết thêm về các chức năng Mid, Left hoặc Right, hãy kiểm tra Trích xuất một phần của chuỗi.
Để biết thêm về chức năng Split, hãy xem String to Array bằng cách sử dụng Split.
Toán tử Like được đề cập trong Các toán tử logic của Excel
Tôi sử dụng Debug.Print trong các ví dụ của mình. Nó in các giá trị vào Cửa sổ https://blog.hocexcel.online/chuc-nang-split-arrange-hide-unhide.htmlmmediate mà bạn có thể xem bằng cách nhấn Ctrl và G (hoặc chọn View->Immediate Window)
Trong bài đăng này, tôi sẽ chỉ cho bạn một cách tốt hơn để trích xuất các giá trị từ một chuỗi thay vì sử dụng hàm VBA InStr với Left, Right hoặc Mid.
Bài đăng này được chia nhỏ như sau:
Nếu bạn muốn kiểm tra xem một chuỗi có chứa giá trị hay không thì InStr là tốt cho công việc. Nếu bạn muốn thực hiện một trích xuất đơn giản thì Left, Right và Mid cũng được sử dụng.
Sử dụng VBA InStr để kiểm tra xem chuỗi có chứa văn bản hay không?
Trong ví dụ sau, chúng ta kiểm tra xem tên có chứa “Henry” hay không? Nếu giá trị trả về của VBA InStr lớn hơn 0 thì chuỗi chứa giá trị mà chúng ta đang kiểm tra.
Hàm Left được sử dụng để lấy các ký tự từ bên trái của một chuỗi.
Hàm Right được sử dụng để lấy các ký tự từ bên phải của một chuỗi.
Hàm Mid được sử dụng cho phần giữa của chuỗi. Nó cũng giống như Left ngoại trừ việc bạn cung cấp cho nó một vị trí bắt đầu.
Ba chức năng này hoạt động tốt nếu văn bản bạn yêu cầu luôn có cùng kích thước và ở cùng một vị trí. Đối với các tình huống khác, chúng yêu cầu sử dụng InStr để tìm một vị trí cụ thể trong chuỗi. Điều này làm cho việc sử dụng chúng trở nên phức tạp.
Nhiều chuỗi bạn sẽ xử lý sẽ có độ dài khác nhau. Một ví dụ đơn giản là khi bạn đang xử lý một danh sách tên. Độ dài chuỗi và phần bạn yêu cầu (ví dụ: tên) có thể khác nhau mỗi lần. Ví dụ
Brooke Hilt
Pamela Jurado
Zack Kinzel
Eddy Wormley
Kaitlyn Rainer
Jacque Trickett
Kandra Stanbery
Margo Hoppes
Berenice Meier
Garrett Hyre
Trong ví dụ sau, chúng ta sẽ lấy tên từ một chuỗi. rong chuỗi này, tên đầu tiên là tên trước khoảng trắng đầu tiên.
Chúng ta sử dụng hàm VBA InStr để lấy vị trí của khoảng trắng đầu tiên. Chúng ta muốn lấy tất cả các ký tự trước khoảng trắng. Chúng ta trừ một từ vị trí vì điều này cho chúng ta vị trí của chữ cái cuối cùng của tên.
Hãy xem ví dụ đầu tiên trong đoạn mã trên. Khoảng trắng đầu tiên ở vị trí 5. Chúng ta trừ đi 1 để cho chúng ta vị trí 4. Đây là vị trí của chữ cái cuối cùng của John, tức là nó.
Sau đó, chúng ta đưa ra 4 cho hàm Left và nó trả về bốn ký tự đầu tiên, ví dụ: “John”
Chúng ta có thể thực hiện cùng một tác vụ trong một dòng bằng cách chuyển giá trị trả về từ VBA InStr sang hàm Left.
Trong ví dụ này, chúng ta sẽ nhận được từ cuối cùng trong chuỗi, tức là Smith. Chúng ta có thể sử dụng hàm InStrRev để giúp chúng ta. Điều này giống với InStr ngoại trừ nó tìm kiếm từ cuối chuỗi.
Điều quan trọng cần lưu ý là InStrRev cung cấp cho chúng ta vị trí từ đầu chuỗi. Do đó, chúng ta cần sử dụng nó hơi khác so với InStr và Left.
Ví dụ trên hoạt động như thế nào
Trong ví dụ tiếp theo, chúng ta sẽ lấy “Henry” từ chuỗi. Từ mà chúng ta đang tìm kiếm nằm giữa khoảng trắng thứ nhất và thứ hai.
Chúng ta sẽ sử dụng chức năng Mid ở đây.
Bạn có thể thấy điều này là khó thực hiện và cần một chút nỗ lực để tìm ra. Chúng ta cần tìm khoảng trắng đầu tiên. Sau đó, chúng ta cần tìm khoảng trắng thứ hai. Sau đó, chúng ta phải trừ một từ khác để cung cấp cho chúng ta số lượng ký tự cần lấy.
Nếu có một chuỗi với nhiều từ thì điều này thực sự có thể rất phức tạp. May mắn cho chúng ta là có một cách dễ dàng hơn nhiều là trích xuất các ký tự từ một chuỗi. Nó được gọi là hàm Split.
Chúng ta có thể sử dụng hàm Split để thực hiện các ví dụ trên. Hàm Split chia một chuỗi thành một mảng. Sau đó, chúng ta có thể dễ dàng truy cập vào từng mục riêng lẻ.
Hãy thử lại ba ví dụ tương tự và lần này chúng ta sẽ sử dụng Split.
Bùm! Sử dụng Split tạo ra sự khác biệt gì. Cách thức hoạt động như sau:
Bảng sau đây cho thấy mảng có thể trông như thế nào sau khi Split được sử dụng.
Lưu ý: vị trí đầu tiên trong mảng là số không. Không có mảng dựa trên không là tiêu chuẩn trong các ngôn ngữ lập trình.
Trong đoạn mã trên, chúng ta chia chuỗi mỗi khi chúng ta sử dụng nó. Chúng ta cũng có thể tách chuỗi một lần và lưu trữ nó trong một biến mảng. Sau đó, chúng ta có thể truy cập nó khi chúng ta muốn.
Nếu bạn muốn biết thêm về mảng thì tôi đã viết toàn bộ bài đăng về chúng có tên là Hướng dẫn hoàn chỉnh để sử dụng mảng trong Excel VBA.
Trong các phần tiếp theo, chúng ta sẽ xem xét một số ví dụ. Bạn sẽ thấy lợi ích của việc sử dụng Split thay vì hàm VBA InStr
Hãy tự mình thử những thứ này trước. Đó là một cách tuyệt vời để học và bạn có thể vui khi thử tìm hiểu chúng (hoặc có thể đó chỉ là tôi!)
Hãy tưởng tượng chúng ta muốn trích xuất các số từ các tên tệp sau:
“VB_23476_Val.xls”
“VV_987_Val.txt”
“VZZA_12223_Val.doc”
Điều này tương tự như ví dụ nơi mà chúng ta nhận được mục thứ hai. Để nhận các giá trị ở đây, chúng ta sử dụng dấu gạch dưới (tức là “_”) để chia chuỗi. Xem ví dụ mã bên dưới:
Trên thực tế, bạn thường đọc các chuỗi như thế này từ một loạt các ô. Vì vậy, giả sử các tên tệp này được lưu trữ trong các ô A1 đến A3. Chúng ta sẽ điều chỉnh mã ở trên một chút để cung cấp cho chúng ta:
Ví dụ ở đây được lấy từ một câu hỏi trên trang web StackOverflow.
Người dùng có một vùng có địa chỉ IP ở định dạng “BE-ABCDDD-DDS 172.16.23.3”.
Anh ta muốn một IP thuộc vùng 172.16 đến 172.31 là hợp lệ. Ví dụ
“BE-ABCDDD-DDS 172.16.23.3″ is valid
“BE-ABCDDD-DDS 172.25.23.3″ is valid
“BE-ABCDDED-DDS 172.14.23.3″ is not valid
“BE-ABCDDDZZ-DDS 172.32.23.3″ is not valid
Đây là cách tôi sẽ làm điều này. Đầu tiên, tôi chia chuỗi theo các dấu chấm. Con số chúng ta đang tìm kiếm nằm giữa dấu chấm đầu tiên và thứ hai. Do đó, nó là mục thứ hai. Khi chúng ta tách chuỗi, nó được đặt ở vị trí một trong mảng (hãy nhớ rằng mảng bắt đầu từ vị trí 0).
Kết quả mảng sẽ giống như thế này
0 | 1 | 2 | 3 |
BE-ABCDDD-DDS 172 | 31 | 23 | 3 |
Đoạn mã dưới đây cho thấy cách thực hiện việc này
Trong ví dụ cuối cùng này không sử dụng VBA InStr, chúng ta muốn kiểm tra xem tên tệp có hợp lệ không cần có ba quy tắc:
Các bảng sau đây hiển thị một số mục hợp lệ và không hợp lệ
Tên tệp | Trang thái |
AA1234.pdf | Hợp lệ |
AA_ljgslf_1234.pdf | Hợp lệ |
AA1234.pdf1 | Không hợp lệ – không kết thúc bằng .pdf |
1234 AA.pdf | Không hợp lệ – AA không đến trước 1234 |
12_AA_1234_NM.pdf | Hợp lệ |
Đầu tiên chúng ta sẽ thực hiện việc này bằng cách sử dụng các hàm VBA InStr và Right.
Mã này rất lộn xộn. May mắn cho chúng ta, VBA có Pattern Matching. Chúng ta có thể kiểm tra mẫu của một chuỗi mà không cần phải tìm kiếm các mục và vị trí, v.v. Chúng ta sử dụng toán tử Like trong VBA để pattern matching. Ví dụ dưới đây cho thấy cách thực hiện.
Trong ví dụ trên, dấu hoa thị trong mẫu đề cập đến bất kỳ số ký tự nào.
Hãy chia nhỏ mẫu này *AA*1234*.pdf
* – bất kỳ nhóm ký tự nào
AA – ký tự chính xác AA
* – bất kỳ nhóm ký tự nào
1234 – ký tự chính xác 1234
* – bất kỳ nhóm ký tự nào
.pdf – ký tự chính xác .pdf
Để hiển thị điều này hoạt động chính xác, hãy thử nó trên tất cả các tên mẫu trong bảng
Đầu ra là:
True
True
False
False
True
VBA InStr và InStrRev chỉ thực sự hữu ích cho các tác vụ đơn giản như kiểm tra xem văn bản có tồn tại trong một chuỗi hay không. Left, Right và Mid rất hữu ích khi vị trí của văn bản luôn giống nhau. Hàm Split là cách tốt nhất để trích xuất từ một chuỗi biến.
Khi cố gắng kiểm tra định dạng của một chuỗi không có kích thước cố định, từ khóa Like (tức là Khớp mẫu Pattern Matching) thường sẽ cung cấp một giải pháp dễ dàng hơn.
Các bạn cảm thấy thế nào về bài hướng dẫn Hàm VBA InStr cũng như cách trích xuất chuỗi mà không cần hàm VBA InStr? Nếu thấy bài viết có ích hãy chia sẻ để mọi người cùng đọc nhé.