Bài viết: Gõ ký tự và Filter

kyo

Nguyễn Khắc Duy
Thành viên BQT
Administrator
Tham gia ngày
4 Tháng sáu 2006
Bài viết
900
Thích
2,592
Điểm
910
#1
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.



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 đỏ):



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



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.



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.



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.



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:



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.

Một số bài viết có liên quan:
1/ Chiêu 38: Thêm dữ liệu vào danh sách Validation một cách tự động
2/ Chiêu 28: Trích xuất dữ liệu số trong 1 chuỗi bằng VBA
3/ 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
4/ 4 cách sử dụng Immediate Window trong VBA hiệu quả hơn
5/ 3 gợi ý nhỏ mang lại thành công trong khai báo biến trong VBA
6/ Tạm dừng VBA bằng cách sử dụng Wait, Sleep hoặc Vòng lặp
7/ Tổng quan về Scripting.Dictionary
8/ Hiểu biết thêm về phương thức Evaluate - Understanding Evaluate Method
9/ Làm việc với Range
10/ Highlight hàng khi di chuyển chuột
 

File đính kèm

Lần chỉnh sửa cuối:

kbw1

Thành viên tích cực
Tham gia ngày
8 Tháng mười một 2013
Bài viết
743
Thích
175
Điểm
220
#2
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.
 

kyo

Nguyễn Khắc Duy
Thành viên BQT
Administrator
Tham gia ngày
4 Tháng sáu 2006
Bài viết
900
Thích
2,592
Điểm
910
#3
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.
 

hidarling

Thành viên mới
Tham gia ngày
31 Tháng mười hai 2010
Bài viết
2
Thích
0
Điểm
0
Tuổi
34
#4
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.
 

kyo

Nguyễn Khắc Duy
Thành viên BQT
Administrator
Tham gia ngày
4 Tháng sáu 2006
Bài viết
900
Thích
2,592
Điểm
910
#5
Chào bạn,

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

Kyo.
 

nguyenbahoc

Thành viên mới
Tham gia ngày
29 Tháng chín 2009
Bài viết
2
Thích
0
Điểm
0
Tuổi
32
#6
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.
 

siRcaM

Thành viên mới
Tham gia ngày
13 Tháng chín 2014
Bài viết
1
Thích
0
Điểm
0
#7
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.
 

kbw1

Thành viên tích cực
Tham gia ngày
8 Tháng mười một 2013
Bài viết
743
Thích
175
Điểm
220
#8
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.
 

buingoc.nd89

Thành viên mới
Tham gia ngày
18 Tháng mười hai 2015
Bài viết
11
Thích
1
Điểm
0
#10
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
 

kyo

Nguyễn Khắc Duy
Thành viên BQT
Administrator
Tham gia ngày
4 Tháng sáu 2006
Bài viết
900
Thích
2,592
Điểm
910
#11
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?
 

kuldokk

Thành viên hoạt động
Tham gia ngày
12 Tháng mười 2007
Bài viết
149
Thích
159
Điểm
680
#12
Cùng ý tưởng :)

................
 
Chỉnh sửa lần cuối bởi điều hành viên:

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,774
Thích
7,236
Điểm
560
#14
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

hoamattroicoi

一人で
Thành viên BQT
Moderator
Tham gia ngày
19 Tháng mười hai 2010
Bài viết
2,492
Thích
5,469
Điểm
610
#15
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]
 

phanvantruong

Thành viên mới
Tham gia ngày
1 Tháng bảy 2010
Bài viết
49
Thích
1
Điểm
365
#17
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.
 

toantn

Thành viên mới
Tham gia ngày
29 Tháng tư 2016
Bài viết
5
Thích
0
Điểm
163
#18
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
 
Top