Trong 1 bài viết cũng khá lâu rồi, mình có chia sẻ với các bạn về cách để tìm kiếm nhanh trên Excel bằng Filter và VBA. Và trong bài này, mình sẽ đi ngược lại một chút để chia sẻ, phân tích với bạn cách để có thể tự tạo lệnh tìm kiếm trong VBA và cách để có thể tùy biến tìm kiếm cho File Excel của riêng bạn.
Tạo lệnh tìm kiếm trong VBA cũng không quá phức tạp, nhưng cũng cần bạn phải biết sử dụng Macro, hàm điều kiện IF và Range, Cells trong VBA. Và nếu bạn đã sẵn sàng, chúng ta bắt đầu thực hiện theo từng bước sau nhé!
Cách tạo lệnh tìm kiếm nhanh bằng Macro Excel
Phần 1: Tạo Filter và Macro
Đầu tiên, bạn hãy dành một hàng trên cùng để tạo Filter.
Tiếp theo, bạn hãy chuyển qua tab Developer và chọn vào Record Macro để tạo Macro trong VBA.
Ở cửa sổ Record Macro, bạn có thể đặt tên cho Macro và sau đó nhấn OK để bắt đầu thực hiện ghi lệnh.
Phần 2: Tiến hành thao tác lọc dữ liệu thủ công bằng công cụ Filter.
💡 Bạn lưu ý là đến bước này mọi thao tác sẽ được ghi vào Macro nên bạn hạn chế thao tác “thừa” để dễ theo dõi lệnh trong VBA nhé.
Chọn vào dấu Filter 🔽, mở Text FIlters và chọn lọc theo Contains….
💡 Lọc theo Contains có nghĩa là lọc tất cả các giá trị có chứa ký tự lọc (bao gồm cả ký tự đơn, chữ, văn bản và chữ không đầy đủ…).
Sau khi chọn Contains thì một cửa sổ Custom AutoFilter hiện lên, bạn cần nhập vào 1 từ khóa để tìm kiếm và chọn OK để thực thi.
Lúc này trong Macro sẽ có 1 lệnh tìm kiếm được tạo ra, nhưng bạn hãy khoan mở Macro. Bạn cần thực hiện tiếp một lệnh tìm kiếm thứ 2.
Cũng như lần tìm kiếm trên, nhưng lần này bạn nhập từ khóa tìm kiếm vào ô Search và chọn OK.
💡 Bạn nên nhập từ khóa tìm kiếm mà chắc chắn nó sẽ có 2 kết quả trở nên nhé.
👉 Sau 2 lần tìm kiếm bằng Filter, bạn cho ngừng Record Macro nhé. Và hãy mở VBA lên để xem chúng ta thu được gì từ các thao tác trên.
Như vậy, kết quả là chúng ta thu được 2 lệnh tìm kiếm. Ở đây, mình sẽ dùng lệnh lần 1 vì nó cho kết quả lọc theo một từ khóa. Nhưng bạn sẽ cần phải để ý đến một số thông số sau trong lệnh để tùy biến:
- Field:=2 : là trường lọc thứ 2. Tức là cột tính theo thứ tự cột của Filter có giá trị bắt đầu là 1.
- Criteria1:=”=*gia*”: gia là từ khóa tìm kiếm. Để thay từ khóa bằng giá trị 1 Cells vào, bạn sẽ thay thế bằng dạng sau: Criteria1:=”=*” & Range(“B3:B3”).Value & “*”
- Operator:=xlAnd sẽ được thay thế bằng Operator:=xlFilterValues, vì ở đây chỉ cần tìm kiếm 1 từ khóa cho 1 cột dữ liệu nên không cần dùng xlAnd.
Phần 3: Thực hiện viết lệnh VBA để tùy biến một hàm tìm kiếm
Khi đã có được lệnh tìm kiếm hoàn chỉnh, bạn sẽ cần phải tiến hành các bước sau để hoàn thiện một hàm tìm kiếm:
- Bắt sự kiện thay đổi của Worksheet => sử dụng sự kiện Selection_Change
- Khóa điều kiện chỉ bắt sự thay đổi tại các Cells nhập từ khóa tìm kiếm => sử dụng hàm IF (ELSEIF)
- Lệnh bắt lỗi nếu có và bỏ qua.
Sử dụng sự kiện Selection_Change
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Code language: VB.NET (vbnet)
Sử dụng hàm IF (ELSEIF)
If Target.Column = 2 And Target.Row = 3 Then 'tìm kiếm theo cột của Cells B3
'lệnh tìm kiếm theo giá trị của Cells B3
ElseIf Target.Column = 3 And Target.Row = 3 Then 'tìm kiếm theo cột của Cells C3
'lệnh tìm kiếm theo giá trị của Cells C3
...'bạn có thể tạo thêm các điều kiện nếu có nhiều cột cần tìm kiếm
End If
Code language: VB.NET (vbnet)
Bắt lỗi nếu có và bỏ qua
Bạn có thể thêm lệnh dưới đây vào sau hàng khai báo hàm. Lệnh này sẽ tự động bỏ qua lỗi (nếu có) và tiếp tục thực thi chương trình.
On Error Resume Next
Code language: VB.NET (vbnet)
Ví dụ: Hàm tìm kiếm hoàn chỉnh
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Column = 2 And Target.Row = 3 Then 'ô B3
ActiveSheet.Range("$A$4:$D$66").AutoFilter Field:=2, Criteria1:="=*" & Range("B3:B3").Value & "*", _
Operator:=xlFilterValues
ElseIf Target.Column = 3 And Target.Row = 3 Then 'ô C3
ActiveSheet.Range("$A$4:$D$66").AutoFilter Field:=3, Criteria1:="=*" & Range("C3:C3").Value & "*", _
Operator:=xlFilterValues
ElseIf Target.Column = 4 And Target.Row = 3 Then 'ô D3
ActiveSheet.Range("$A$4:$D$66").AutoFilter Field:=4, Criteria1:="=*" & Range("D3:D3").Value & "*", _
Operator:=xlFilterValues
End If
End Sub
Code language: VB.NET (vbnet)
OK! Như vậy là qua bài chia sẻ này, bạn đã biết cách tạo ra hàm tìm kiếm nhanh như thế nào rồi. Thực ra những lệnh phức tạp như lệnh tìm kiếm này hơi khó để nghĩ ra, nhưng bằng những kiến thức cơ bản như sử dụng Macro, hàm IF là bạn đã có thể tạo ra nó và tùy biến lại cho phù hợp với mục đích của riêng mình.
Và cuối cùng, mình hy vọng thủ thuật này đã giúp bạn giải quyết được vấn đề đang tìm kiếm.
Chúc các bạn thành công!
mình xem mà vẫn k hiểu cho lắm, có thể giúp mình viết cụ thể 1 lệnh không. mình cần giúp đỡ để qua được khóa luận. cảm ơn. nếu giúp thì hãy rep để mình gửi đề