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:
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.

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

  • TangLaoDong.xls
    1.8 MB · Đọc: 16
Upvote 0
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!
 
Upvote 0
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
 
Upvote 0
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?
 
Upvote 0
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

  • Testing.rar
    385 bytes · Đọc: 15
Upvote 0
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 ")
 
Upvote 0
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 ạ
 
Upvote 0
Gõ ký tự và Filter

Cách 2: Tạo 1 Textbox


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

36524298710_8fc93b69ce_b.jpg

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ó".
 
Upvote 0
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!
 
Upvote 0
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.

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
Xin được hỏi anh (chị), khi tìm tên thì tên trong ô tìm kiếm bị lỗi.
Nhờ anh (chị ) chỉ giúp tôi cách khắc phục, muốn tô đậm chữ trong ô tìm kiếm vào đâu để chỉnh vậy ạ?
Tôi xin cảm ơn!
loi.png
 
Lần chỉnh sửa cuối:
Upvote 0
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.

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
Tôi làm theo hướng dẫn nhưng Excel báo lỗi VBA (file đính kèm). Excel 2016. Đã enable all macro. Vui lòng hướng dẫn.
 

File đính kèm

  • Lỗi VBA.doc
    32 KB · Đọc: 5
Upvote 0
Web KT
Back
Top Bottom