Hỏi cách đưa mảng vào Criteria:=Array(...) trong AutoFilter

Liên hệ QC

linhcute2000

Thành viên mới
Tham gia
1/4/16
Bài viết
29
Được thích
10
Chào Anh, Chị trên diễn đàn!

Xin phép Anh, Chị trên diễn đàn chỉ cho mình cách đưa mảng vào Criteria trong Autofilter.

Cụ thể mình Record macro được code sau
Mã:
Sub Macro1()
    Range("$A$1:$B$101").AutoFilter 2, Criteria1:=Array("Mat hang A001", "Mat hang A003", "Mat hang A004", "Mat hang A006", "Mat hang A008", "Mat hang A010"), Operator:=xlFilterValues
End Sub

Nhưng mình muốn chỗ Criteria1:=Array("...……") này không phải gõ bằng tay. Mà phần này mình có sẵn danh sách ở 1 vùng trên Sheet, có thể có nhiều giá trị.
Ví dụ là vùng D2: D11: chứa 10 giá trị cần Filter

Vậy phải viết code như thế nào để chỗ Criteria này là 1 mảng từ danh sách.

Mục đích: dùng autofilter các mã định sẵn để delete dòng 1 lần không phải vòng lặp qua từng giá trị để xóa dòng.

Xin trân trọng cảm ơn!
 

File đính kèm

  • Criteria Array AutoFilter.xlsm
    15 KB · Đọc: 30
Thử xem nhé
Mã:
Sub Macro1()
Dim lastRow As Long, crit
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "D").End(xlUp).Row
        If lastRow = 1 Then Exit Sub
        crit = Application.Transpose(.Range("D2:D" & lastRow).Value)
        .Range("$A$1:$B$101").AutoFilter 2, Criteria1:=crit, Operator:=xlFilterValues
    End With
End Sub
 
Upvote 0
Thử xem nhé
Mã:
Sub Macro1()
Dim lastRow As Long, crit
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "D").End(xlUp).Row
        If lastRow = 1 Then Exit Sub
        crit = Application.Transpose(.Range("D2:D" & lastRow).Value)
        .Range("$A$1:$B$101").AutoFilter 2, Criteria1:=crit, Operator:=xlFilterValues
    End With
End Sub
Dạ con cảm ơn Bác đã trả lời ạ!

Bác cho con hỏi thêm là nếu danh sách Criteria không nằm trên Range mà nó nằm ở trong Dic

Con add nó vào Dic, vậy mình phải vòng lặp như nào để đưa vào Array Criteria ạ?
(Set Dic = CreateObject("Scripting.Dictionary") )

Ví dụ con có 10 giá trị đó nằm trong Dic (Dic.count = 10, 10 giá trị trong đây ạ!)
 
Upvote 0
Dạ con cảm ơn Bác đã trả lời ạ!

Bác cho con hỏi thêm là nếu danh sách Criteria không nằm trên Range mà nó nằm ở trong Dic

Con add nó vào Dic, vậy mình phải vòng lặp như nào để đưa vào Array Criteria ạ?
(Set Dic = CreateObject("Scripting.Dictionary") )

Ví dụ con có 10 giá trị đó nằm trong Dic (Dic.count = 10, 10 giá trị trong đây ạ!)
Bạn nên đưa file dữ liệu thực tế lên luôn để mọi người tiện giúp đỡ.
Theo tôi được biết Dic bao gồm Key và Item.
10 giá trị trong Dic là 10 Key hay 10 Item.
Nếu là 10 key thì bạn chuyển các key này ra mảng 1 chiều
Mã:
Dim Crit as Variant
Crit = Dic.keys
 
Upvote 0
Bạn nên đưa file dữ liệu thực tế lên luôn để mọi người tiện giúp đỡ.
Theo tôi được biết Dic bao gồm Key và Item.
10 giá trị trong Dic là 10 Key hay 10 Item.
Nếu là 10 key thì bạn chuyển các key này ra mảng 1 chiều
Mã:
Dim Crit as Variant
Crit = Dic.keys
Đúng như bạn nói, đưa vào mảng 1 chiều thì nó nhận luôn.
Cảm ơn bạn!

ReDim Arr(0 To Dic.count))

Criteria1:=Arr
 
Upvote 0
Bạn nên đưa file dữ liệu thực tế lên luôn để mọi người tiện giúp đỡ.
Theo tôi được biết Dic bao gồm Key và Item.
10 giá trị trong Dic là 10 Key hay 10 Item.
Nếu là 10 key thì bạn chuyển các key này ra mảng 1 chiều
Mã:
Dim Crit as Variant
Crit = Dic.keys
Đưa trực tiếp Dic.Keys vào điều kiện trong Filter có được không bạn?
 
Upvote 0
Đúng như bạn nói, đưa vào mảng 1 chiều thì nó nhận luôn.
Cảm ơn bạn!

ReDim Arr(0 To Dic.count))

Criteria1:=Arr
Khi đưa toàn bộ key của Dic vào mảng 1 chiều thì bạn chỉ cần khai báo biến mảng thôi, không cần Redim.
Ngoài ra, nếu làm Redim thì phải là Redim Arr(0 to Dic.count - 1)
 
Upvote 0
Khi đưa toàn bộ key của Dic vào mảng 1 chiều thì bạn chỉ cần khai báo biến mảng thôi, không cần Redim.
Ngoài ra, nếu làm Redim thì phải là Redim Arr(0 to Dic.count - 1)

Nói chung là mình biết, ở đây mình chỉ viết ý là vậy thôi. Redim là do thoái quen chỉ định độ dài cho nó!
Ở bài này mình hỏi lý do là mình không biết cái Array của Criteria ông Microsoft ổng nhận như nào thôi...
Vì code mình cũng có biết chút chút...á!
 
Upvote 0
Đưa trực tiếp Dic.Keys vào điều kiện trong Filter có được không bạn?
Em không làm trực tiếp nên chưa phát hiện ra.
Em thử rồi, không cần đưa ra mảng, cứ sử dụng luôn Criteria1:=Dic.keys là ra được kết quả luôn.
Em cám ơn anh đã chỉ bảo.
 
Upvote 0
Nói chung là mình biết, ở đây mình chỉ viết ý là vậy thôi. Redim là do thoái quen chỉ định độ dài cho nó!
Ở bài này mình hỏi lý do là mình không biết cái Array của Criteria ông Microsoft ổng nhận như nào thôi...
Vì code mình cũng có biết chút chút...á!
TÚm lại là bạn cần ARRAY hay Dic.Keys - thấy hỏi thì array một hồi xoay sang dic, nên thống nhất thì mới làm được
 
Upvote 0
Thế bạn lấy ở đâu để nhập vào dic?

Dạ cái này cũng là nằm từ dữ liệu con add vào Dic ạ!

Nhưng tại vì sheet dữ liệu Filter có điều kiện nên con cần đưa vào Dic những giá trị đó vào Dic để khi cần gọi ra ạ! (Vì danh mục ngoài range có những giá trị nhưng trong Sheet nhập liệu lại không có nên nếu đưa hết vào mảng thì sợ Filter không được ạ!).
 
Upvote 0
Dạ cái này cũng là nằm từ dữ liệu con add vào Dic ạ!

Nhưng tại vì sheet dữ liệu Filter có điều kiện nên con cần đưa vào Dic những giá trị đó vào Dic để khi cần gọi ra ạ! (Vì danh mục ngoài range có những giá trị nhưng trong Sheet nhập liệu lại không có nên nếu đưa hết vào mảng thì sợ Filter không được ạ!).
Đọc bài không hiểu gì ta.Bạn đưa được vào mà không lấy được ra là sao.Bạn nên đọc lại dictionary xem.
https://www.giaiphapexcel.com/diendan/threads/bài-11-dictionary.130130/
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cái này cũng là nằm từ dữ liệu con add vào Dic ạ!

Nhưng tại vì sheet dữ liệu Filter có điều kiện nên con cần đưa vào Dic những giá trị đó vào Dic để khi cần gọi ra ạ! (Vì danh mục ngoài range có những giá trị nhưng trong Sheet nhập liệu lại không có nên nếu đưa hết vào mảng thì sợ Filter không được ạ!).
Tôi đã chưa hình dung được. Những cái bạn add vào dic là bạn lấy từ sheet nào đó. Vậy thì thay vì add vào dic rồi lấy dic.keys là crit thì sao không đưa "chúng" vào mảng dùng để làm crit?

Nhưng bây giờ tôi hình dung được rồi. Những dữ liệu trên sheet "nào đó" kia bạn không dùng tất cả để làm crit mà bạn muốn lọc theo 1 tiêu chí nào đấy rồi mới lấy kết quả lọc làm crit.

Đấy là tôi nghĩ ra một lý do chính đáng chứ thực ra ý bạn thế nào thì bạn vẫn chưa nói rõ. Nhưng nói tóm lại là có lý do để dùng dic.
 
Upvote 0
Dạ cái này cũng là nằm từ dữ liệu con add vào Dic ạ!

Nhưng tại vì sheet dữ liệu Filter có điều kiện nên con cần đưa vào Dic những giá trị đó vào Dic để khi cần gọi ra ạ! (Vì danh mục ngoài range có những giá trị nhưng trong Sheet nhập liệu lại không có nên nếu đưa hết vào mảng thì sợ Filter không được ạ!).

Đã dùng VBA: Đã dùng Dic cho chiều ngang của dữ liệu, sao không dùng luôn với chiều dọc lại còn Autofilter làm chi?
 
Upvote 0
Chào Anh, Chị trên diễn đàn!
.....................................
Nhưng mình muốn chỗ Criteria1:=Array("...……") này không phải gõ bằng tay. Mà phần này mình có sẵn danh sách ở 1 vùng trên Sheet, có thể có nhiều giá trị.
Ví dụ là vùng D2: D11: chứa 10 giá trị cần Filter
.....................................
Xin trân trọng cảm ơn!
Thử code sau (xử lý trên sheet):
Mã:
Sub Filter()
     Sheet1.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("C1:C11"), Unique:=False
     Sheet1.Range("A1").CurrentRegion.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub

A_Filter.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Thử xem nhé
Mã:
Sub Macro1()
Dim lastRow As Long, crit
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "D").End(xlUp).Row
        If lastRow = 1 Then Exit Sub
        crit = Application.Transpose(.Range("D2:D" & lastRow).Value)
        .Range("$A$1:$B$101").AutoFilter 2, Criteria1:=crit, Operator:=xlFilterValues
    End With
End Sub
Anh có thể cho em hỏi với điều kiện là mảng em mong muốn ( Lọc tại luôn dữ liệu )
+ Nếu dữ liệu từ ô A5 đến G5 rỗng thì sẽ bỏ lọc
+ Nếu dữ liệu từ ô A5 đến G5 sẽ tiếp tục lọc (Có thể là 1 ô A5 hoặc hoặc a5, B5.. hoặc tất cả các ô từ A5- B5 đều có điều kiện
Em cũng muốn hỏi thêm anh là với Việc sử dụng AutoFiler như vậy thì có cách nào cải thiện tốc độ đối với file này không ạ?
Em cảm ơn anh ạ
 

File đính kèm

  • AutoFilter.xlsm
    90.5 KB · Đọc: 23
Upvote 0
Anh có thể cho em hỏi với điều kiện là mảng em mong muốn ( Lọc tại luôn dữ liệu )
+ Nếu dữ liệu từ ô A5 đến G5 rỗng thì sẽ bỏ lọc
+ Nếu dữ liệu từ ô A5 đến G5 sẽ tiếp tục lọc (Có thể là 1 ô A5 hoặc hoặc a5, B5.. hoặc tất cả các ô từ A5- B5 đều có điều kiện
Em cũng muốn hỏi thêm anh là với Việc sử dụng AutoFiler như vậy thì có cách nào cải thiện tốc độ đối với file này không ạ?
Em cảm ơn anh ạ
Anh (Chị) xem giúp em vấn đề này với ạ !
 
Upvote 0
Web KT
Back
Top Bottom