Bài viết: Tổng hợp về phương thức tìm kiếm FIND (P1)

Liên hệ QC

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,900
Được thích
5,277
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Find Method

Phương thức Find tìm kiếm thông tin trong một vùng nào đó, kết quả trả về là ô đầu tiên chứa đựng thông tin được tìm thấy. Nếu không tìm thấy thông tin trong vùng tìm kiếm thì phương thức Find sẽ trả về Nothing.

Cú pháp phương thức như sau :

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Expression : Vùng tìm kiếm. Biểu thức Expression phải được khai báo và nó trả về một đối tượng Range.

What : Dữ liệu hay thông tin cần tìm kiếm. Đây là một đòi hỏi bắt buộc phải khai báo. Dữ liệu tìm kiếm có thể là một chuỗi ký tự hay một dạng dữ liệu nào đó có trong Excel và được khai báo dưới dạng Variant.

After : Ô được chọn để xác định vị trí tìm kiếm, là tùy chọn, được khai báo dưới dạng Variant, có thể bỏ qua. Việc tìm kiếm sẽ bắt đầu từ ô này. Ô này tương ứng với vị trí của ô hiện hành sau khi việc tìm kiếm hoàn tất. Ô xác định vị trí tìm kiếm này sẽ không được đưa vào quá trình tìm kiếm trừ khi vùng tìm kiếm bao gồm cả ô này. Nếu đối số này không được khai báo thì việc tìm kiếm sẽ bắt đầu sau ô trên cùng bên trái của vùng cần tìm kiếm.

LookIn : Không bắt buộc, khai báo dạng Variant. Đây là một dạng thông tin và thường có giá trị là xlValues.

LookAt : Cách thức tìm kiếm. Là đối số tùy chọn, không bắt buộc, khai báo dưới dạng Variant. LookAt có 2 giá trị : xlWhole (Tìm toàn bộ) hoặc xlPart (tìm một phần).

SearchOrder : Xác định dạng thứ tự tìm kiếm, là tùy chọn không bắt buộc, khai báo dưới dạng Variant. SearchOrder có 2 dạng ứng với 2 hàng số : xlByRows (theo thứ tự dòng) hoặc xlByColumns (theo thứ tự cột)

SearchDirection : Hướng tìm kiếm, là tùy chọn. SearchDirection có 2 dạng ứng với 2 hằng số : xlNext (Tìm kế tiếp, là giá trị mặc định), xlPrevious (Tìm trước đó)

MatchCase : Là tùy chọn để xác định kiểu tìm kiếm có phân biệt chữ Hoa với chữ thường, khai báo dưới dạng Variant. Khai báo là True nếu ta muốn tìm kiếm chính xác. Giá trị mặc định là False.( Không phân biệt chữ in Hoa với chữ thường)

MatchByte : Không bắt buộc, khai báo dạng Variant. Chỉ sử dụng khi ta đã chọn hoặc cài đặt bộ hỗ trợ ngôn ngữ ký tự byte kép. Là True nếu ứng với bộ ký tự byte kép, False nếu ứng với bộ ký tự byte đơn.

SearchFormat : Tìm kiếm theo định dạng. Là tham số tùy chọn, khai báo dưới dạng Variant.

Lưu ý :

- Các thiết lập cho các đối số LookIn, LookAt, SearchOrder MatchByte sẽ được lưu mỗi lần ta sử dụng phương thức này (phương thức Find). Nếu ta không khai báo giá trị cho các đối số vào lần sử dụng phương thức Find tiếp theo, các giá trị thiết lập đã lưu trước đó sẽ được sử dụng. Việc thiết lập các đối số này làm thay đổi các tùy chọn thiết lập trong hộp thoại Find, và việc thay đổi các thiết lập trong hộp thoại Find sẽ làm thay đổi các giá trị đã lưu - là những giá trị được sử dụng nếu ta bỏ qua các đối số này. Để tránh xảy ra việc này, ta nên khai báo các đối số một cách rõ ràng mỗi lần sử dụng phương thức Find này.

- Ta có thể dùng phương thức FindNextFindPrevious để lặp lại việc tìm kiếm. Khi đến vị trí cuối của vùng tìm kiếm được xác định trước đó, excel sẽ bao phủ từ vị trí này đến vị trí đầu tiên của vùng tìm kiếm. Để ngưng việc tìm kiếm ngay khi động tác bao phủ này xảy ra, hãy lưu lại địa chỉ của ô đầu tiên tìm được, sau đó thử so sánh lần lượt mỗi địa chỉ ô được tìm thấy kế tiếp với địa chỉ ô vừa được lưu này.

Các ví dụ minh họa về Find Method

Áp dụng : Để hiểu rõ hơn về phương thức tìm kiếm Find, ta xét một vài ví dụ minh họa sau :
1.> Ta có dữ liệu như sau :
36824570692_3e9ceaeb10_o.png


Ta sẽ dùng phương thức Find để tìm ra trong vùng A1:A10 những ô nào có ký tự 1
Ta dùng chuột bôi đen vùng A1:A10 và cho chạy Macro sau :

PHP:
Sub Test1()
    Dim Rng As Range
    Set Rng = Selection.Find("1*", LookIn:=xlValues, LookAt:=xlWhole)
    If Not Rng Is Nothing Then
        Do
            MsgBox Rng.Address
            Set Rng = Selection.FindNext(Rng)
        Loop
    End If
End Sub

Lần lượt các kết quả của việc chạy Macro như sau :
36824570842_7b01ab9397_b.jpg

Diễn giải về trình tự hoạt động của Macro như sau :


- Tìm trong vùng từ ô A2 đến ô A10 xem ô nào có chứa ký tự 1. Kết quả là ô A3 được tìm thấy đầu tiên và sẽ gán biến Rng bằng ô A3. Các bạn sẽ hỏi là tại sao không tìm bắt đầu từ ô A1 và tại sao không trả về ô A1 đầu tiên mà lại là ô A3. Các bạn xem trong cấu trúc của phương thức Find thì sẽ thấy có một đối số tùy chọn, đó là After. Đây là tham số dùng để xác định vị trí bắt đầu của việc tìm kiếm, việc tìm kiếm sẽ bắt đầu tại vị trí sau ô này. Nếu không khai báo thì việc tìm kiếm sẽ bắt đầu ngay sau ô đầu tiên bên trái của vùng tìm kiếm. Như VD trên thì vùng tìm kiếm Selection (A1:A10), do không khai báo nên việc tìm kiếm sẽ bắt đầu từ ô A2 và ô A3 được tìm thấy đầu tiên.


- Tham số What trong phương thức Find ở VD trên sử dụng thêm ký tự "*" để tìm gần đúng (chuỗi bắt đầu bởi số 1). Bỏ dầu "*" ta sẽ tìm chính xác.

- Nếu như không tìm thấy ô nào trong vùng Selection có chứa số 1 (Biến Rng = Nothing) thì sẽ thoát khỏi thủ tục. Ngược lại, sẽ bắt đầu vào vòng lặp tìm kiếm Do Loop.

- Sau khi tìm thấy và gán biến Rng cho ô A3 thì hiện hộp thoại thông báo về địa chỉ của ô vừa được tìm thấy ( biến Rng). Khi đó tham số After sẽ là ô A3 và việc tìm kiếm sẽ bắt đầu sau ô này.

- Tiếp theo ta sẽ dùng phương thức FindNext(Rng) để tìm đến ô chứa số 1 tiếp theo và ô A5 được tìm thấy, biến Rng sẽ là ô A5 . Quá trình cứ tiếp tục như thế cho đến ô A10.

- Khi dò tìm đến ô A10 thì quá trình dò tìm sẽ được lặp lại như lúc ban đầu, tức là sẽ tìm kiếm lặp lại từ ô A1 đến ô A10. Nhưng khi đó tham số After sẽ là ô A10 và lúc này ô A1 sẽ được tìm thấy. Và tiếp đến là ô A3, A5…sẽ tìm kiếm mãi mãi.

- Khi gán biến Rng bằng ô A5 thì đến từ khóa Loop. Khi gặp từ khóa này thì quá trình tiềm kiếm sẽ được tiếp tục, đến từ khóa Do, hiện hộp thông báo và lại gán biến Rng bằng ô A6….

Đoạn Code trên còn 2 vấn đề cần khắc phục, đó là làm sao để tìm thấy được ô A1 đầu tiên và sẽ kết thúc quá trình tìm kiếm khi dò tìm đến ô A10.

Đoạn Code sau sẽ khắc phục điều này :


PHP:
Sub Test2()
    Dim Rng As Range, LastCell As Range, FirstAddress As String
    Set LastCell = Selection.Cells(Selection.Cells.Count)
    Set Rng = Selection.Find("1*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            MsgBox Rng.Address
            Set Rng = Selection.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

- Đầu tiên ta sẽ gán biến LastCell ứng với ô cuối cùng của vùng cần tìm kiếm : LastCell = [A10]

- Trong phương thức Find ta sẽ thấy có xuất hiện thêm tham số After có giá trị là LastCell. Điều này có nghĩa là việc tìm kiếm sẽ bắt đầu sau ô [A10]. Và như thế là ô [A1] sẽ được tìm thấy đầu tiên. Sau đó gán biến Rng bằng ô [A1].

- FirstAddress là chuỗi text ứng với địa chỉ của ô được tìm thấy đầu tiên trong vùng, ta gán biến FirstAddress = "$A$1".

- Nếu Rng khác Nothing thì đi đến vòng lặp Do Loop, nếu là Nothing thì thoát khỏi thủ tục.

- Vào vòng lặp Do loop thì quá trình tương tự như đoạn Sub Test1. Tuy nhiên trong đoạn Code này còn có thêm một biểu thức điều kiện : FirstAddress <> Rng.Address.

- Loop While FirstAddress <> Rng.Address : đoạn này có ý nghĩa như sau : quá trình tìm kiếm sẽ được lặp lại nếu như địa chỉ của biến Rng hiện tại khác với địa chỉ của ô đầu tiên được tìm thấy trong vùng vùng ( ô A1). Ngược lại, nếu trùng thì có nghĩa rằng ô này đã được tìm thấy trước đó, sẽ hủy bỏ kết quả này và thoát khỏi thủ tục.

Một số bài viết có liên quan:
1/ Tổng quan về FileSystemObject (phần 1)
2/ [Gỡ rối VBA] Lỗi vòng lặp lặp vô tận - Lỗi từ vòng lặp
3/ Hàm để lấy chỉ số màu trong các ô đã Conditional Formatting
4/ Xếp một trường theo một trật tự màu quy định trước
5/ Sử dụng Name trong VBA
6/ Viết code để nhìn thấy ai là người cập nhật bảng tính của bạn lần gần đây nhất
7/ 3 gợi ý nhỏ mang lại thành công trong khai báo biến trong VBA
8/ Tổng quan về Scripting.Dictionary
9/ Khi nào nên sử dụng Msgbox, Inputbox và Userform?
10/ Làm thế nào để thay thế các chữ OK, CANCEL,... nhàm chán của Msgbox
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT
Back
Top Bottom