TRÍCH XUẤT TỪ BẤT KỲ CHUỖI NÀO MÀ KHÔNG CẦN SỬ DỤNG VBA INSTR 

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 

Hướng dẫn nhanh về bài đăng này

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))

Ghi chú tham chiếu nhanh

Để 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)

Giới thiệu

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:

  • Phần 1: Cách trích xuất từ ​​các chuỗi có kích thước cố định.  
  • Phần 2: Cách trích xuất từ ​​các chuỗi có kích thước thay đổi.  
  • Phần 3: Cách trích xuất từ ​​chuỗi có kích thước thay đổi bằng hàm Split.  
  • Phần 4 đến Phần 6: Ví dụ.

Khi VBA InStr, Left, Right và Mid hữu ích

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.

1-VBA InStr
1-VBA InStr

 

Truy xuất với Left, Right and Mid

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.

2-VBA InStr
2-VBA InStr
3-VBA InStr
3-VBA InStr

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.

4-VBA InStr
4-VBA InStr

Đối phó với các chuỗi chiều dài thay đổi

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

Sử dụng hàm VBA InStr với Left

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.

5-VBA InStr
5-VBA InStr

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ó.

6-VBA InStr
6-VBA InStr

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.

7-VBA InStr
7-VBA InStr

Sử dụng hàm VBA InStr với Right

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.

8-VBA InStr
8-VBA InStr

Ví dụ trên hoạt động như thế nào

  1. Chúng ta lấy vị trí của khoảng trắng cuối cùng bằng cách sử dụng InStrRev: 11. 
  2. Chúng ta nhận được độ dài của chuỗi: 16. 
  3. Chúng ta trừ vị trí cho độ dài: 16-11 = 5. 
  4. Chúng ta cho 5 cho hàm Right và lấy lại Smith.
9-VBA InStr
9-VBA InStr

Sử dụng hàm VBA InStr với Mid

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.

10-VBA InStr
10-VBA InStr

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.

11-VBA InStr
11-VBA InStr

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.

Hàm Split

12-VBA InStr
12-VBA InStr

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.

13-VBA InStr
13-VBA InStr

Bùm! Sử dụng Split tạo ra sự khác biệt gì. Cách thức hoạt động như sau:

  1. Hàm Split chia chuỗi bất kỳ nơi nào có khoảng trắng.  
  2. Mỗi mục đi vào một vị trí mảng bắt đầu từ vị trí số không. 
  3. Sử dụng số lượng của một vị trí, chúng ta có thể truy cập một mục mảng.

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.

14-VBA InStr
14-VBA InStr

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.

15-VBA InStr
15-VBA InStr

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!)

Ví dụ 1: Lấy một phần của tên tệp

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:

16-VBA InStr
16-VBA InStr

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:

17-VBA InStr
17-VBA InStr

Ví dụ 2: Vùng địa chỉ IP

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

18-VBA InStr
18-VBA InStr

Ví dụ 3: Kiểm tra xem tên tệp có hợp lệ không

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:

  • Nó phải kết thúc bằng .pdf 
  • Nó phải chứa AA 
  • Nó phải chứa 1234 sau AA

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.

19-VBA InStr
19-VBA InStr

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.

20-VBA InStr
20-VBA InStr

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

21-VBA InStr
21-VBA InStr

Đầu ra là:

True

True

False

False

True

Kết luận

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 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é. 


Tác giả: dtnguyen (Nguyễn Đức Thanh)

· · ·

Khóa học mới xuất bản