Gõ ký tự và Filter

Liên hệ QC
Gõ ký tự và Filter


Bạn có một danh sách rất lớn và bạn cần sử dụng chức năng Filter của Excel để tìm kiếm. Tuy nhiên, thật sự rất mất thời gian khi mỗi lần bạn muốn filter cái gì là bạn phải bấm vào mũi tên rồi gõ vào ô Search.


36920773845_a2208c7132_o.png


Tuy nhiên, chỉ cần một vài thủ thuật VBA nho nhỏ là bạn hoàn toàn có thể khiến cho quá trình này trở nên nhanh chóng hơn.


Cách 1: Sử dụng ô làm nơi tìm kiếm

Đầu tiên, tôi sẽ tạo 1 ô để gõ ký tự cần cho Filter. Sau đó, bạn cần chọn Sheet có chứa ô đó, giả sử ở đây của tôi là Sheet1, là bởi vì tôi sẽ sử dụng sự kiện của Sheet. Tiếp theo bạn chọn Worksheet và sự kiện Change giống như hình dưới đây (vùng khoanh màu đỏ):


36920773485_68b99cf7ea_b.jpg


Kế đến, bạn hãy chép đoạn code này vào:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim EndR As Long

If Target.Address <> "$C$1" Then Exit Sub

Application.EnableEvents = False

Range("$C$3:$C$1734").AutoFilter Field:=1, Criteria1:="*" & Range("C1").Value & "*", Operator:=xlFilterValues

Application.EnableEvents = True

End Sub

Như vậy mỗi khi bạn gõ ký tự nào trong ô C1, danh sách ở dưới sẽ tự động Filter theo ký tự đó.


36920773245_a1ea2027cf_o.png


Nếu bạn để ý trên dòng code, bạn sẽ thấy một số chỗ để có thể chỉnh sửa phù hợp với mục đích của bạn, đó là:
1/ $C$1: Bạn có thể sửa lại nếu bạn muốn đặt ô để gõ tại một chỗ khác. Tuy nhiên bạn lưu ý rằng thuộc tính Address của ô sẽ lấy theo giá trị tuyệt đối, do đó ví dụ bạn muốn sửa tại A1 thì phải sửa là $A$1 nhé.
2/ Tương tự, dòng Range("$C$3:$C$1734") chính là nơi chứa danh sách để Filter. Bạn cũng có thể thay nó bằng một danh sách ở chỗ khác.


Cách 2: Tạo 1 Textbox

Nếu bạn không muốn dùng ô có sẵn của Excel vì mỗi khi gõ xong phải bấm Enter rất mất thời gian, bạn có thể sử dụng cách khác là vẽ 1 Textbox để tương tác động trực tiếp với Filter luôn. Bạn có thể làm như sau:

Vào thẻ Developer của thanh Ribbon -> Insert -> Textbox tại ActiveX Control.


36920773025_9eb9e53fb1_b.jpg


Sau đó bạn vẽ ra tại nơi bạn muốn, và rồi bạn bấm chuột phải vào nó chọn Properties.


36920772665_6a39f3abdf_o.png


Một cửa sổ sẽ hiện ra, phần Linked Cell, bạn hãy cho nó liên kết với một ô nào đó trên bảng tính. Ở đây tôi tận dụng luôn ô C1 có sẵn.


36920772415_a3e04ae98b_o.png


Kế đó, bạn nhấn đúp vào Textbox và chọn sự kiện TextBox_Change. Sau đó, bạn hãy chép đoạn code sau vào:

Mã:
Private Sub TextBox1_Change()
Range("$C$3:$C$1734").AutoFilter Field:=1, Criteria1:="*" & Range("C1").Value & "*", Operator:=xlFilterValues
End Sub

Và kết quả bạn có như sau:


36524298710_8fc93b69ce_b.jpg


Từ đây bạn có thể nhận thấy sự khác biệt giữa 2 cách chứ?

Chúc bạn thành công.
 

File đính kèm

  • Filter nhanh.xlsm
    55.9 KB · Đọc: 175
Chỉnh sửa lần cuối bởi điều hành viên:
Ngày trước mình có hỏi về chủ đề này.
Giải pháp này có 2 vấn đề hy vọng bạn trả lời.
Thứ 1 là nếu muốn filter nhiều cột thì làm thế nào. Tức là filter cột A, xong cột B, ... vài cột khác nữa.
Thứ 2 là vs dữ liệu lớn 2 giải pháp trên có đáp ứng được không.
Mình từng thử vs dữ liệu hơn 10.000 dòng thì nó khá chậm.
 
Upvote 0
Chào bạn,

Vấn đề thứ nhất của bạn nó còn tùy thuộc vào bạn muốn filter như thế nào. Có nghĩa là bạn muốn search và filter từng cột một hay một lúc? Muốn search một lúc? Muốn chỉ click hay gõ? ... Có rất nhiều cách, tuy nhiên đó chỉ là về mặt thủ thuật để giúp cho công việc trở nên đơn giản, tiện dụng và trông có vẻ "bắt mắt", "chuyên nghiệp" hơn thôi. Còn về code, bạn record macro về cách filter nhiều cột là sẽ thấy VBA làm như thế nào ngay.

Với vấn đề thứ hai, đây là một chủ đề được bàn rất nhiều trên GPE và cách xử lý cũng rất đa dạng, tùy thuộc vào cách bố trí dữ liệu cũng như cách xuất hiện của dữ liệu sau đó của bạn nữa (bạn muốn nó xuất hiện đè vào bảng cũ hay copy kết quả ra một chỗ khác hoặc ...). Tuy nhiên, một công thức chung của việc lọc dữ liệu đó là sử dụng Filter, Advanced Filter, PivotTable, VBA thông thường: vòng lặp, mảng,... VBA kết hợp SQL,... Trở lại câu hỏi của bạn, nếu một dữ liệu đơn thuần là text hoặc số của bạn thì sẽ đáp ứng được, nhưng với bảng tính toàn công thức thì bạn nên cân nhắc giải pháp khác.
 
Upvote 0
Bạn ơi cho mình hỏi excel 2013 có thay đổi gì về lệnh không vì mình thử như bạn hướng dẫn nhưng không lọc được.
 
Upvote 0
Chào bạn,

Bạn up file lên để mọi người cùng giúp bạn nhé.

Kyo.
 
Upvote 0
Ngày trước mình có hỏi về chủ đề này.
Giải pháp này có 2 vấn đề hy vọng bạn trả lời.
Thứ 1 là nếu muốn filter nhiều cột thì làm thế nào. Tức là filter cột A, xong cột B, ... vài cột khác nữa.
Thứ 2 là vs dữ liệu lớn 2 giải pháp trên có đáp ứng được không.
Mình từng thử vs dữ liệu hơn 10.000 dòng thì nó khá chậm.

Bài viết cũng hay, cảm ơn bạn. Nhưng mình cũng có thắc mắc giống bạn. Nếu 1 sheet thì chỉ tạo được 1 ô tìm kiếm, cho 1 cột. Vậy cùng 1 sheet đó, mình có thể tạo ô tìm kiếm khác, tìm kiếm cho các cột khác được không? Cảm ơn bạn.
 
Upvote 0
Cám ơn kyo đã chia sẻ. VD mình muốn lọc để cho ẩn dòng nếu đáp ứng điều kiện thì làm thế nào (ngược lại là lọc để hiển thị dữ liệu như VD này). Mình thử macro nhưng hình như là dữ liệu nhiều quá nên ko đc.
 
Upvote 0
Bài viết cũng hay, cảm ơn bạn. Nhưng mình cũng có thắc mắc giống bạn. Nếu 1 sheet thì chỉ tạo được 1 ô tìm kiếm, cho 1 cột. Vậy cùng 1 sheet đó, mình có thể tạo ô tìm kiếm khác, tìm kiếm cho các cột khác được không? Cảm ơn bạn.
Sau 1 hồi đảo đi đảo lại mình quyết định dùng chức năng mặc định của filter. Vì vs dữ liệu lớn chức năng này đáp ứng được.
Còn dữ liệu ít thì dùng như trên cho nhanh.
 
Upvote 0
Sao mình làm mãi mà không được nhỉ, copy đoạn code vào rồi nhưng không biết làm thế nào để nó chạy, cứ thế tắt đi thì không dùng được hxhx, có ai giúp mình với, tải fie về làm thử mà cũng ko được hxhx
 
Upvote 0
Bạn kyo cho mình hỏi có thể chuyển code này vào trong modun được không?

Bạn chuyển vào module thì ở phần sheet nên gọi thủ tục đó ra, ví dụ thủ tục mang tên abc thì bạn sẽ dùng Call abc để gọi nó.

[COLOR=#000000 đã viết:
buingoc.nd89][/COLOR]Sao mình làm mãi mà không được nhỉ, copy đoạn code vào rồi nhưng không biết làm thế nào để nó chạy, cứ thế tắt đi thì không dùng được hxhx, có ai giúp mình với, tải fie về làm thử mà cũng ko được hxhx


Bạn đã bật macro chưa?
 
Upvote 0
Theo hường dẫn của bạn Kyo, mình tạo bảng lọc theo nhiều điều kiện trên nhiều cột, tất cả đều ổn tuy nhiên nếu dữ liệu lọc định dạng theo % thì lại chay sai, các bạn giúp mình xem sai chổ nào, cách khắc phục, cám ơn
trong File, nhập điều kiện vào ô tô màu. cột I và cột J giống nhau chỉ khác định dạng nhưng cột J chạy sai
 

File đính kèm

  • LocDK.xlsm
    20.5 KB · Đọc: 79
Upvote 0
Theo hường dẫn của bạn Kyo, mình tạo bảng lọc theo nhiều điều kiện trên nhiều cột, tất cả đều ổn tuy nhiên nếu dữ liệu lọc định dạng theo % thì lại chay sai, các bạn giúp mình xem sai chổ nào, cách khắc phục, cám ơn
trong File, nhập điều kiện vào ô tô màu. cột I và cột J giống nhau chỉ khác định dạng nhưng cột J chạy sai
Khắc phục : khi cột thuế định dạng là % bạn đổi câu lệnh điều kiện Filter về thuộc tính chấm text thay vì Value xem nhé.
[Criteria1:=Range("J1").Text]
 
Upvote 0
Bài này rất hay nó ngược so với nội dung bài Tạo danh sách tìm kiếm thông minh ngay trong ô
kyo.
Bài này thì mình hiểu và đã làm được tuy nhiên bài của Bác Kyo mình chưa biết làm thế nào liên kết DMKH lên ô excel và list box.
Bạn nào có thể chỉ giáo mình xin cám ơn.
 
Upvote 0
Em đặt mã code giống của anh Kyo và đã chỉnh sửa theo hướng dẫn, em đặt lọc cột B nhưng không hiểu sao nó lại lọc cột A nhỉ. Bác xem giúp lỗi vì sao nhỉ



Private Sub Worksheet_Change(ByVal Target As Range)

Dim EndR As Long

If Target.Address <> "$B$4" Then Exit Sub

Application.EnableEvents = False

Range("$B$7:$B$36").AutoFilter Field:=1, Criteria1:="*" & Range("B4").Value & "*", Operator:=xlFilterValues

Application.EnableEvents = True

End Sub
 
Upvote 0
Range("$B$7:$B$36").AutoFilter Field:=2, Criteria1:="*" & Range("B4").Value & "*", Operator:=xlFilterValues

Chuyển
AutoFilter Field:=2 là OK
 
Upvote 0
Web KT
Back
Top Bottom