Xin giới thiệu hàm Filter trong VBA.

Liên hệ QC

sealand

Thành viên gạo cội
Tham gia
16/5/08
Bài viết
4,883
Được thích
7,688
Giới tính
Nam
Nghề nghiệp
Kế Toán
Trong khi tìm hiểu 1 số hàm trong VBA vô tình mình thấy 1 hàm mảng rất hay mà ít thấy ai dùng. Đó là hàm Filter().Mình xin giới thiệu để các bạn cùng tham khảo

Hàm có cú pháp

PHP:
Filter(sourcesrray, match[,  include[, compare]])
Hàm hỗ trợ rất nhiều tuỳ biến lọc đáp ứng các yêu cầu. Hàm được hướng dẫn khá rõ trong Help của VBA.
Ta có thể sử dụng để lọc khi nạp các đối tượng trên Form, lọc chép ra vùng khác.
Mình ví dụ tuỳ biến lọc của nó khi nạp Listbox trên form

PHP:
Sub nhap()
Dim tam1
tam1 = Application.Transpose(Sheet1.Range("a1:a20"))
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub
Các bạn mở file ví dụ tham khảo và thấy có đơn giản mà hay không?
 

File đính kèm

  • vi du.xls
    37.5 KB · Đọc: 1,708
Lần chỉnh sửa cuối:
Trong khi tìm hiểu 1 số hàm trong VBA vô tình mình thấy 1 hàm mảng rất hay mà ít thấy ai dùng. Đó là hàm Filter().Mình xin giới thiệu để các bạn cùng tham khảo

Hàm có cú pháp

PHP:
Filter(sourcesrray, match[,  include[, compare]])
Hàm hỗ trợ rất nhiều tuỳ biến lọc đáp ứng các yêu cầu. Hàm được hướng dẫn khá rõ trong Help của VBA.
Ta có thể sử dụng để lọc khi nạp các đối tượng trên Form, lọc chép ra vùng khác.
Mình ví dụ tuỳ biến lọc của nó khi nạp Listbox trên form

PHP:
Sub nhap()
Dim tam1
tam1 = Application.Transpose(Sheet1.Range("a1:a20"))
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub
Các bạn mở file ví dụ tham khảo và thấy có đơn giản mà hay không không?
EM thêm chút dư vị cho nó anh nhé:
Filter

Mô tả:
Filter (sourcearray, match [, include [, compare]])
Lọc mảng sourcesrray với giá trị lọc là match

Tham số:
sourcearray
Mảng cần lọc
match
Giá trị lọc
include
Lọc đảo (True hoặc False)
compare
Chỉ rõ kiểu dữ liệu để so sánh trong quá trình lọc

Ghi chú:
Dùng cho tham số compare
vbUseCompareOption = –1
Chế độ tùy chọn, VB sẽ tự động lựa lọai dữ liệu thích hợp
vbBinaryCompare = 0
So sánh nhị phân
vbTextCompare = 1
So sánh chuỗi
vbDatabaseCompare = 2
So sánh dữ liệu

Ví dụ:
Option Explicit
Private Sub Form_Load()
Dim selNames() As String
Dim Names(1 To 5) As String
Names(1) = "A"
Names(2) = "B"
Names(3) = "C"
Names(4) = "D"
Names(5) = "E"
selNames = Filter(Names, "A")' Returns "A"
selNames = Filter(Names, "B", False)'Returns "A", "C", "D", "E"
End Sub
PM: Cai đó hình như nó nằm trong file này anh nè( Của anh PHan sưu tầm thì phải?)
 
Lần chỉnh sửa cuối:
Upvote 0
Trong khi tìm hiểu 1 số hàm trong VBA vô tình mình thấy 1 hàm mảng rất hay mà ít thấy ai dùng. Đó là hàm Filter().Mình xin giới thiệu để các bạn cùng tham khảo

Hàm này có thể lọc nguyên văn được không anh?

Ví dụ
: trong mảng {"a", "a", "ab", "abc", "c"}.
Nếu ta cần lọc "a" thì nó chỉ trả về kết quả là {"a", "a"} chứ không phải là {"a", "a", "ab", "abc"}.
 
Upvote 0
Trong khi tìm hiểu 1 số hàm trong VBA vô tình mình thấy 1 hàm mảng rất hay mà ít thấy ai dùng. Đó là hàm Filter().Mình xin giới thiệu để các bạn cùng tham khảo
Chiêu này hơi bị ngon đây!
Em nghĩ anh có thể áp dụng để sửa lại file từ điển của anh rồi đấy
Ẹc... Ẹc...
 
Upvote 0
Ứnd dụng hàm Filter bác Sealand vừa giới thiệu, mình làm cái Form này thấy vui vui, post lên khoe chút chơi.@$@!^%@$@!^%@$@!^%

attachment.php

PHP:
Private Sub TxtFind_Change()
    LstRes.Clear
    LstRes.List = Filter(WorksheetFunction.Transpose _
    (Range("Data")), TxtFind.Text, True, vbTextCompare)
    If TxtFind = "" Then LstRes.Clear
End Sub
 

File đính kèm

  • 10-01-10 9-36-48 PM.jpg
    10-01-10 9-36-48 PM.jpg
    76.1 KB · Đọc: 1,197
  • Ham Filter.xls
    51 KB · Đọc: 680
Upvote 0
Em nghĩ bác nên dùng Unicode luôn cho chuẩn nha! Mắt công đổi Font lắm!
Thân.
 

File đính kèm

  • Ham Filter.xls
    47 KB · Đọc: 502
Lần chỉnh sửa cuối:
Upvote 0
Em nghĩ bác nên dùng Unicode luôn cho chuẩn nha! Mắt công đổi Font lắm!
Thân.

Mình chỉ vọc chơi cho vui thôi --=0--=0--=0, tại vì cái danh sách của mình nó có Font VNTimes New Roman nên mình phải chạy theo nó mà. Bạn nào thấy ứng dụng được thì chỉ cần đổi Font lại là được rồi.
 
Upvote 0
Mình thấy đề tài này thật hấp dẫn, vì phạm vi ứng dụng rẩt rộng. Đề nghị Admin đưa ra thành một chủ đề mới để mọi người cùng thảo luận. Mình thử đặt tiêu đề là "ComboBox nhiều cột với dữ liệu được lọc" không biết có được không?

Sau khi xem file Ví dụ của bạn, mình có 1 số ý kiến như sau:

1. Hàm Filter() chỉ áp dụng được với mảng dữ liệu 1 chiều. Điều này gây hạn chế trong quá trình áp dụng với ComboBox, vì nhiều khi chúng ta muốn tạo ComboBox có nhiều cột cũng có nghĩa là phải dùng mảng 2 chiều, en en.
2. Hàm Transpose(), trong ví dụ của bạn, khi áp dụng với mảng có phần tử mang dữ liệu kiểu Date thì sau khi Transpose Kiểu Date sẽ chuyển về dạng chữ số!!! Làm sao bây giờ???
3. Mình thử thay đổi giá trị của một Record cho trùng với giá trị của dòng trên thì kết qua 3trong ListBox cũng có 2 dòng giống nhau!!! Kỳ quá, phải lọc nó ra chứ.

Rất mong các bạn chỉ giáo thêm.
 
Upvote 0
To tungson_mrcc:
1/Phần tiêu đề có phần không ổn rồi, ở đây chúng ta chỉ muốn trao đổi cùng nhau việc sử dụng hàm Filter cho những việc phù hợp. Trong khi bạn biết rằng hàm Filter không làm được lọc mảng đa chiều thì sao đáp ứng được tiêu đề.
2/Bạn lại cầu toàn quá rồi, nói chung hàm này không phải thay thế tất cả mà nó có thế mạnh hơn hẳn trong từng lĩnh vực. Cũng như thày thuốc, tuỳ cơ sử dụng gia giảm sẽ có hiệu quả hơn bình thường.
3/Về ngày tháng thì không phải hàm Transpose làm thay đổi mà nạp bình thường sẽ bị dính lỗi này ngay. Bạn sửa đi 1 chút
PHP:
Sub nhap()
Dim tam1
For Each cll In Sheet1.Range("a1:a20").Cells
chuoi = chuoi & Format(cll, "dd/mm/yyyy") & ";"
Next
tam1 = Split(chuoi, ";")
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub
4/Bạn nhầm rồi, nếu bạn dùng Filter nó cũng vậy. Đây là lọc thoả mãn điều kiện chứ không phải lọc duy nhất nên có bao nhiêu phần tử giống nhau mà thoả điều kiện nó cũng liệt kê tất.
 
Upvote 0
To tungson_mrcc:
Bạn nhầm rồi, nếu bạn dùng Filter nó cũng vậy. Đây là lọc thoả mãn điều kiện chứ không phải lọc duy nhất nên có bao nhiêu phần tử giống nhau mà thoả điều kiện nó cũng liệt kê tất.

Mình nghĩ có thể dùng thuộc tính .Exists của Object Dictionary để tạo ra 1 List đã trích lọc duy nhất, sau đó =Filter(.Keys, ...). Anh Sealand thấy có khả thi không?, có lẽ hôm nào rảnh sẽ làm thử --=----=----=--
 
Upvote 0
3/Về ngày tháng thì không phải hàm Transpose làm thay đổi mà nạp bình thường sẽ bị dính lỗi này ngay. Bạn sửa đi 1 chút
PHP:
Sub nhap()
Dim tam1
For Each cll In Sheet1.Range("a1:a20").Cells
chuoi = chuoi & Format(cll, "dd/mm/yyyy") & ";"
Next
tam1 = Split(chuoi, ";")
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub
4/Bạn nhầm rồi, nếu bạn dùng Filter nó cũng vậy. Đây là lọc thoả mãn điều kiện chứ không phải lọc duy nhất nên có bao nhiêu phần tử giống nhau mà thoả điều kiện nó cũng liệt kê tất.
--------------------------
Mình nghĩ có thể dùng thuộc tính .Exists của Object Dictionary để tạo ra 1 List đã trích lọc duy nhất, sau đó =Filter(.Keys, ...). Anh Sealand thấy có khả thi không?, có lẽ hôm nào rảnh sẽ làm thử
Nếu đã dùng đến vòng lập thì chẳng cần Filter làm gì cho mất công, vì ngay trong vòng lập, ta xử lý kết quả luôn
Mổi cái có cái hay riêng, ở đây Filter có 1 thế mạnh gần giống như ta dùng AutoFilter trong bảng tính vậy, tức không cần vòng lập ---> Nếu muốn Filter nhiều điều kiện, tôi nghĩ chẳng gì qua mặt được các chức năng sẳn có của Excel đâu!
 
Upvote 0
Nếu cố gắng làm theo hướng này thì không phải không ra nhưng trông nó chẳng hay tí nào cả. Gửi bác xem thử chơi nè!
Thân.
 

File đính kèm

  • vi du.rar
    19.7 KB · Đọc: 358
Upvote 0
Gửi bạn Sealand
Cám ơn bạn đã nhiệt tình trả lời. Thực ra mình đang tìm cách xử lý vụ ComboBox với nhiều cột, mà lại còn phải thỏa mãn điều kiện được chọn trước từ một com bo khác (chính bài toán chọn vật tư theo nhóm, úng dụng khi làm phiếu xuất nhập kho). Thấy ý tưởng của bạn cũng rất hay nên tìm cách áp dụng mà chưa được.
Nếu bạn thấy bàn về vấn đề này trong topic của bạn là không phù hợp thì thành thật xin lỗi nghe.

Thuốc nam cũng chữa được nhiều bệnh mà tây y đang bó tay đấy.
 
Upvote 0
Ý bác ấy không muốn nói nặng nhẹ gì đâu. Bạn đừng có hiểu lằm nha.
Tại hàm Filter() này chỉ áp dụng được mảng 1 chiều thôi.
Nếu muốn ghép mãng 2 chiều (hoặc đa chiều) vào nữa thì nó hơi rườm ra thôi.
Và cũng phải dùng vòng lặp For..next nên thấy nó không hay cho lắm.
Đơn giản là chỉ cần dùng 1 vòng lặp For..next thì đã có thể giải quyết vấn đề [(chính bài toán chọn vật tư theo nhóm, úng dụng khi làm phiếu xuất nhập kho).] của bạn rồi không cần hàm Filter() đâu.

PS: Mình cũng là dân thuốc nam đây. Rất vui được quen biết 1 người cùng nghề nha!
Bạn có biết nhiều về thuốc nam không? Nếu có thì cùng thảo luận nha!
Có gì Add nick của mình rồi nói tiếp nha!
Thân.
 
Upvote 0
Gửi bạn Sealand
...........
Nếu bạn thấy bàn về vấn đề này trong topic của bạn là không phù hợp thì thành thật xin lỗi nghe.

Thuốc nam cũng chữa được nhiều bệnh mà tây y đang bó tay đấy.
Trời! Thế nào mà bạn lai hiểu ra như vậy, cái hàm Filter bị hạn chế cố hữu là mảng 1 chiều nên nó chỉ phù hợp cho Combo 1 cột thôi. Vậy thì sao nó đáp ứng được yêu cầu của bạn?
Trong bài chỉ là cách ví von thôi, mình là dân Kế toán mà. Mong bạn thông cảm mình viết không rõ ràng.
Thân Sealand.
 
Upvote 0
Anh/chị cho em hỏi với.
Trong form thiết kế phần listbox em muốn cho hiện cột a và b thi phải làm sao.
Mong anh chị chỉ giúp.

Sub nhap
()
Dim tam1
tam1
= Application.Transpose(Sheet1.Range("a1:a20"))
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub
 
Upvote 0
Anh/chị cho em hỏi với.
Trong form thiết kế phần listbox em muốn cho hiện cột a và b thi phải làm sao.
Mong anh chị chỉ giúp.

Sub nhap
()
Dim tam1
tam1
= Application.Transpose(Sheet1.Range("a1:a20"))
tam1 = Filter(tam1, Me.ComboBox1, IIf(Me.CheckBox1, 1, 0))
Me.ListBox1.List() = tam1
End Sub

Rất tiếc là hàm Filter chỉ làm việc được với mảng 1 chiều nên từ 2 cột lại phải làm với phương pháp khác
 
Upvote 0
Ai có thể cho e đoạn code ổn ổn cho hàm Filter đx k? E rất cần nó để làm bảng kê quản lý các loại báo cáo theo thời hạn. Thay vì dùng Fill btg thì e muốn dùng hàm để tự động áp dụng cho hệ thống các máy của cty luôn, mà khổ nỗi e lại k rành về VBA
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom