VBA Tìm kiếm (Tìm) Giá trị trong Mảng

Hướng dẫn này sẽ trình bày cách Tìm kiếm (Tìm) Giá trị trong Mảng trong VBA

Có một số cách bạn có thể tìm kiếm một chuỗi trong một mảng - tùy thuộc vào việc mảng là một chiều hay nhiều chiều.

Tìm kiếm trong mảng một chiều

Để tìm kiếm giá trị trong mảng một chiều, bạn có thể sử dụng Hàm bộ lọc.

123 Dim z As Variant'lọc mảng ban đầuz = Bộ lọc (Mảng, Chuỗi, Đúng, vbCompareBinary)

Cú pháp của tùy chọn Bộ lọc như sau

Bộ lọc (Mảng nguồn, Khớp dưới dạng chuỗi, [Bao gồm dưới dạng Boolean], [So sánh dưới dạng vbCompareMethod])

Các Mảng nguồn Khớp dưới dạng chuỗi được yêu cầu trong khi Bao gồm dưới dạng BooleanSo sánh như vbCompareMethod là tùy chọn. Nếu chúng không được bao gồm, chúng được đặt thành ThậtvbCompareBinary tương ứng.

Tìm các giá trị phù hợp với Bộ lọc

1234567891011121314 Sub FindBob ()'Tạo mảngDim strName () Làm biến thểstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'khai báo một biến thể để lưu trữ dữ liệu bộ lọc trongDim strSubNames As Variant'lọc mảng ban đầustrSubNames = Bộ lọc (strName, "Bob")'nếu giá trị LBound của bạn lớn hơn -1, thì giá trị đã được tìm thấyNếu LBound (strSubNames)> -1 thì MsgBox ("Tôi tìm thấy Bob")Kết thúc Sub

Mảng thứ hai sẽ giữ các giá trị được bộ lọc tìm thấy. Nếu giá trị LBound và UBound của bạn không phải là -1, thì mảng đã quản lý để tìm giá trị mà bạn đang tìm kiếm.

Bạn cũng có thể xem số lần văn bản xuất hiện trong mảng ban đầu.

1234567891011121314 Sub CountNames ()'Tạo mảngDim strName () Làm biến thểstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'khai báo một mảng để lưu trữ dữ liệu bộ lọc trongDim strSubNames As Variant'lọc mảng ban đầustrSubNames = Bộ lọc (strName, "Bob")'nếu bạn trừ đi LBound từ các giá trị UBound và thêm 1, chúng tôi sẽ nhận được số lần văn bản xuất hiệnMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "tên được tìm thấy."Kết thúc Sub

Tìm các giá trị KHÔNG khớp với Bộ lọc

Các [Bao gồm dưới dạng Boolean] tùy chọn cho phép bạn tìm bao nhiêu giá trị trong mảng của bạn ĐỪNG phù hợp với bộ lọc của bạn

1234567891011121314 Sub CountExtraNames ()'tạo mảngDim strName () Làm biến thểstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'khai báo một mảng để lưu trữ dữ liệu bộ lọc trongDim strSubNames As Variant'lọc mảng ban đầustrSubNames = Bộ lọc (strName, "Bob", Sai)'nếu bạn trừ đi LBound từ các giá trị UBound và thêm 1, chúng tôi sẽ nhận được số lần văn bản xuất hiệnMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "tên được tìm thấy."Kết thúc Sub

do đó chúng tôi đã sửa đổi dòng này:

1 strSubNames = Bộ lọc (strName, "Bob")

với dòng này:

1 strSubNames = Bộ lọc (strName, "Bob", Sai)

Sử dụng dòng này trong mã, sẽ trả về tất cả các tên KHÔNG khớp với “Bob”.

Bộ lọc phân biệt chữ hoa chữ thường

Bạn sẽ thấy rằng bộ lọc phân biệt chữ hoa chữ thường theo mặc định. Điều này đúng cho tất cả các hàm VBA. Nếu bạn muốn tìm kiếm văn bản không phân biệt chữ hoa chữ thường, bạn cần sửa đổi mã của mình một chút.

1 z = Bộ lọc (strName, "bob" ,, vbTextCompare)

Thêm vbTextCompare vào dòng bộ lọc của bạn sẽ cho phép mã của bạn tìm thấy “bob” hoặc “Bob”. Nếu điều này bị bỏ qua, VBA theo mặc định sẽ sử dụng vbBinaryCompare mà sẽ chỉ tìm kiếm dữ liệu là CHÍNH XÁC trận đấu. Lưu ý trong ví dụ trên, chúng tôi đã bỏ qua [Bao gồm dưới dạng Boolean] đối số để True được giả định.

Tùy chọn So sánh Văn bản

Ngoài ra, bạn có thể thêm văn bản Tùy chọn So sánh Văn bản lên đầu mô-đun của bạn - điều này sẽ làm cho tất cả các hàm mà bạn viết trong mô-đun cụ thể đó không phân biệt chữ hoa chữ thường.

Sử dụng một vòng lặp để tìm kiếm qua một mảng

Sử dụng vòng lặp phức tạp hơn một chút so với sử dụng chức năng Bộ lọc. Chúng ta có thể tạo một hàm sẽ lặp qua tất cả các giá trị trong mảng.

1234567891011121314151617 Sub LoopThroughArray ()'tạo mảngDim strName () Làm biến thểstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strTìm dưới dạng chuỗistrFind = "Bob"Dim i As Long'lặp qua mảngĐối với i = LBound (strName, 1) Đến UBound (strName, 1)Nếu InStr (strName (i), strFind)> 0 ThìMsgBox "Đã tìm thấy Bob!"Thoát choKết thúc nếuTiếp theo tôiKết thúc Sub

Để tìm một phần của chuỗi văn bản, tức là “Bob” thay vì “Bob Smith” hoặc “Bob Williams”, chúng tôi cần sử dụng Hàm hướng dẫn trong Câu lệnh If. Điều này được tìm kiếm trong chuỗi được trả về bởi vòng lặp từ Mảng để xem liệu “Bob” có trong chuỗi hay không và như nó nằm trong chuỗi, nó sẽ trả về một hộp thông báo và sau đó Thoát khỏi Vòng lặp.

Tìm kiếm trong mảng đa chiều

Chúng tôi cũng sử dụng vòng lặp để tìm kiếm thông qua một mảng đa chiều. Một lần nữa, chúng ta cần tạo một hàm cho phép chúng ta lặp qua tất cả các giá trị trong mảng, nhưng lần này, chúng ta cũng cần lặp qua từng chiều của mảng.

123456789101112131415161718192021222324252627 Hàm LoopThroughArray ()Dim varArray () As VariantDim strFind As StringstrFind = "Bác sĩ"'khai báo kích thước của mảngReDim varArray (1, 2)'khởi tạo mảngvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Kế toán"varArray (1, 1) = "Thư ký"varArray (1, 2) = "Bác sĩ"'khai báo các biến cho vòng lặpDim i As Long, j As Long'vòng lặp cho thứ nguyên đầu tiênĐối với i = LBound (varArray, 1) Đến UBound (varArray, 1)'vòng lặp cho chiều thứ haiĐối với j = LBound (varArray, 2) Đến UBound (varArray, 2)'nếu chúng tôi tìm thấy giá trị, thì hộp thư đến thông báo rằng chúng tôi có giá trị và thoát khỏi hàmNếu varArray (i, j) = strFind ThìMsgBox "Đã tìm thấy bác sĩ!"Chức năng thoátKết thúc nếuTiếp theo jTiếp theo tôiChức năng kết thúc
wave wave wave wave wave