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

nqt76

Thành viên mới
Tham gia ngày
27 Tháng mười hai 2017
Bài viết
12
Được thích
0
Điểm
163
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
*************************************
Chào Kyo,
Với đoạn code của bạn, giờ tôi muốn tùy biến vào file đình kèm thì phải làm như thế nào. Yêu cầu là: khi nhập ký tự vào cột AL ở sheet "Truong_hop_Tang" thì sẽ link với dữ liệu ở cột E của sheet "XA_HUYEN_TINH" và hiện ra danh sách (theo dạng row) tương ứng ngay bên dưới cell đang nhập. Sau khi chọn được dữ liệu cần tìm và enter thì sẽ lấy mã của cột B trong sheet "XA_HUYEN_TINH" đưa vào ô vừa nhập.
 

File đính kèm

kh0jy3n

Thành viên thường trực
Tham gia ngày
21 Tháng tư 2012
Bài viết
238
Được thích
72
Điểm
395
Nơi ở
Thủy Nguyên - Hải phòng
Chào anh
Em muốn dư liệu lọc ở 1 sheets # thì sao ạ
Vd như đây dang là côt C ở Shet 1 bây giờ em muốn tìm cột A ở shets 2 thì làm cách nào ạ
Em cảm ơn!
 

ndu96081631

Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,312
Điểm
11,910
Chào anh
Em muốn dư liệu lọc ở 1 sheets # thì sao ạ
Vd như đây dang là côt C ở Shet 1 bây giờ em muốn tìm cột A ở shets 2 thì làm cách nào ạ
Em cảm ơn!
Đã gọi là AutoFilter thì đứng chỗ nào filter chỗ đó. Trường hợp muốn lọc chỗ này sang chỗ khác thì chỉ có thể là Advanced Filter (nếu không muốn mất công AutoFilter xong lại phải Copy/Paste
 

kh0jy3n

Thành viên thường trực
Tham gia ngày
21 Tháng tư 2012
Bài viết
238
Được thích
72
Điểm
395
Nơi ở
Thủy Nguyên - Hải phòng
Đã gọi là AutoFilter thì đứng chỗ nào filter chỗ đó. Trường hợp muốn lọc chỗ này sang chỗ khác thì chỉ có thể là Advanced Filter (nếu không muốn mất công AutoFilter xong lại phải Copy/Paste
Dạ vâng em cảm ơn ạ !
Chúc anh một buổi sáng tốt lành ạ
 

ExcelQN

Thành viên hoạt động
Tham gia ngày
7 Tháng năm 2011
Bài viết
125
Được thích
41
Điểm
370
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.
Sao trong file đính kèm, không đánh số thứ tự của danh sách theo autofill được vậy anh kyo?
 

abdung

Thành viên mới
Tham gia ngày
9 Tháng hai 2012
Bài viết
7
Được thích
2
Điểm
365
Tuổi
29
Chào mọi người.
Mình có file như này, muốn làm Macro Filter nhưng chỉ áp dụng được khi dùng Filter chữ,
Còn filter số trong file thì lại ra kết quả Blank.
Ví dụ Filter cột 2 (chữ) ra kết quả, nhưng cột 4 thì không.

Mã:
    Sub test()

    Workbooks("testing.csv").Activate
    ActiveSheet.Range("$A:$I").AutoFilter Field:=4, Criteria1:="=*" & InputBox("Filter ") & "*"
    
    End Sub

Filter 4.PNG

Filter 2.PNG
 

File đính kèm

phulien1902

GPE - My love
Tham gia ngày
6 Tháng bảy 2013
Bài viết
3,046
Được thích
3,568
Điểm
560
Nơi ở
Hải Phòng
Chào mọi người.
Mình có file như này, muốn làm Macro Filter nhưng chỉ áp dụng được khi dùng Filter chữ,
Còn filter số trong file thì lại ra kết quả Blank.
Ví dụ Filter cột 2 (chữ) ra kết quả, nhưng cột 4 thì không.

Mã:
    Sub test()

    Workbooks("testing.csv").Activate
    ActiveSheet.Range("$A:$I").AutoFilter Field:=4, Criteria1:="=*" & InputBox("Filter ") & "*"
   
    End Sub

View attachment 203035

View attachment 203034
Bạn thay:
PHP:
Criteria1:="=*" & InputBox("Filter ") & "*"
bằng:
PHP:
Criteria1:=InputBox("Filter ")
 

Tiến2202

Thành viên mới
Tham gia ngày
25 Tháng ba 2018
Bài viết
3
Được thích
0
Điểm
13
Tuổi
29
muốn linkcell tới 2 ô của 2 cột khác nhau để khi chạy sẽ tìm kiếm lọc cho 2 bảng khác nhau được không ạ
 

Tiến2202

Thành viên mới
Tham gia ngày
25 Tháng ba 2018
Bài viết
3
Được thích
0
Điểm
13
Tuổi
29
Thế mỗi khi lọc em phải chuyển qua chuyển lại giữa 2 sheet để xem kết quả ạ. Cảm ơn Bác nhiều
 

anh79_ct

Thành viên chính thức
Tham gia ngày
23 Tháng năm 2007
Bài viết
51
Được thích
0
Điểm
668
Tuổi
39
Gõ ký tự và Filter

Cách 2: Tạo 1 Textbox


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


Cho mình hỏi là muốn dời Text box này thì làm sao vậy? Hình như bạn đã khóa trong file "filter nhanh.xlsm" rồi

Mình nghĩ là có thể tạo nhiều trường để lọc trong 1 bảng tính. Đang thử nghiệm :)

Mình đã thử với bảng dữ liệu khoảng 17 ngàn dòng vẫn "chạy nhanh như gió".
 

anh79_ct

Thành viên chính thức
Tham gia ngày
23 Tháng năm 2007
Bài viết
51
Được thích
0
Điểm
668
Tuổi
39
Cho mình hỏi là muốn dời Text box này thì làm sao vậy? Hình như bạn đã khóa trong file "filter nhanh.xlsm" rồi

Mình nghĩ là có thể tạo nhiều trường để lọc trong 1 bảng tính. Đang thử nghiệm :)

Mình đã thử với bảng dữ liệu khoảng 17 ngàn dòng vẫn "chạy nhanh như gió".
Mình đã tìm hiểu ra là chọn chế độ "Desing Mode" thì sẽ thay đổi được. Bỏ qua bài trên nhé! Xin cảm ơn!
 
Top