Hướng dẫn cách sử dụng chức năng Advanced Filter trong VBA

Khi tìm hiểu về bộ lọc nâng cao trong VBA, chúng ta sẽ thấy nó phức tạp hơn và ít gặp hơn so với chức năng lọc tự động (AutoFilter).

Thế nhưng bộ lọc nâng cao sẽ giúp chúng ta có thể lọc theo các tiêu chí phức tạp hơn cách lọc tự động, với nhiều tiêu chí lọc trên nhiều cột cùng một lúc. Bộ lọc nâng cao cho phép sao chép dữ liệu lọc được sang vị trí khác, giúp chúng ta rút ngắn được các bước cần thực hiện trong câu lệnh VBA.

Cấu trúc của câu lệnh Advanced Filter trong VBA

TenSheet.Range(VungCanLoc).AdvancedFilter CachThucLoc, VungDieuKienLoc, ViTriTraKQ, GiaTriKhongTrung

TenSheet = Tên sheet chứa dữ liệu cần lọc (dữ liệu gốc = VungCanLoc)

VungCanLoc = Vùng cần lọc dữ liệu (có bao gồm tiêu đề các cột)

CachThucLoc (action) = Cách thức lọc dữ liệu: copy ra vị trí khác (số 2) hay lọc tại chính bảng dữ liệu (số 1)

VungDieuKienLoc (criteriaRange) = Vùng chứa điều kiện lọc. Vùng này phải bao gồm Tên tiêu đề của cột và Điều kiện lọc ở từng cột tương ứng

ViTriTraKQ (copyToRange) = Vị trí trả về kết quả dữ liệu sau khi lọc

GiaTriKhongTrung (unique) = Trả về kết quả là các giá trị không trùng, chỉ xuất hiện 1 lần hay không

Sau đây chúng ta cùng tìm hiểu ví dụ về việc đưa nhiều tiêu chí vào bộ lọc nâng cao và trả lại kết quả lọc vào một trang tính riêng.

Yêu cầu

Cho bảng dữ liệu gốn các chỉ tiêu: Họ Tên / Ngày bán / Số lượng / Tên sản phẩm theo hình sau:

Sử dụng AdvancedFilter VBA để lọc các nội dung theo điều kiện sau

  • Họ tên = Long
  • Ngày bán: Từ ngày 01/01/2018 đến 31/01/2018
  • Sản phẩm: A

Cách làm

Chúng ta xây dựng vùng điều kiện và vị trí kết quả cần lấy tại Sheet Vidu2 như sau:

(nút lệnh RUN dùng để Assign Macro lọc dữ liệu bằng Advance Filter)

Lưu ý khi lập vùng điều kiện:

Ngày bán ở đây có 2 mốc ngày: Từ ngày và đến ngày, do đó phải tách ra thành 2 điều kiện tại ô B2 và ô C2

Trong cửa sổ VBA chúng ta viết lệnh như sau:

Giải thích câu lệnh VBA

  • Sheet2.Range(“A6:D100”).ClearContents là xóa hết dữ liệu ở sheet2, vùng từ A6 đến D100. Đây là vùng sẽ chứa dữ liệu kết quả của lệnh lọc dữ liệu. Cần thực hiện thao tác này trước để tránh việc có dữ liệu cũ có thể xuất hiện xen lẫn với kết quả lọc mới. Giới hạn tới dòng D100 tùy thuộc vào độ lớn của vùng kết quả mong muốn (có thể quy định sẵn có bao nhiêu cột kết quả, số dòng kết quả lớn nhất bao nhiêu dòng hoặc dùng Range động cho nội dung này)
  • Sheet1.Range(“A1”, Sheet1.Range(“D” & Rows.Count).End(xlUp)).AdvancedFilter 2, Sheet2.[A1:D2], Sheet2.[A6] là sử dụng chức năng lọc nâng cao tại Sheet1, vùng dữ liệu từ A1 (bao gồm tiêu đề ở dòng 1) tới dòng cuối có chứa dữ liệu ở cột D, lấy điều kiện theo vùng tại Sheet2, vùng A1:D2, kết quả sẽ được trích xuất ra vị trí ô A6 tại Sheet2, cách thức lọc dữ liệu là copy kết quả lọc ra vị trí khác.

Kết quả sau khi chạy lệnh này như sau:

Như vậy chúng ta có thể thấy chỉ với 1 dòng lệnh lọc nâng cao đã có thể trích xuất được dữ liệu theo nhiều điều kiện phức tạp đúng như yêu cầu.

Cách này rất hữu ích cho chúng ta trong việc xây dựng các báo cáo chi tiết theo nhiều đối tượng, nhiều yêu cầu chi tiết, lập các báo cáo chi tiết tự động một cách dễ dàng.

Link tải về file mẫu tại đây: http://bit.ly/2qYKmLZ

Để hiểu rõ hơn về cách sử dụng VBA trong Excel bạn nên tham gia khóa học “Tự động hóa Excel với lập trình VBA” của Học Excel Online. Khóa học sẽ giúp bạn nắm được cách sử dụng ngôn ngữ VBA, cách viết lệnh lập trình trong VBA để tự động hóa chương trình Excel, cách viết các hàm tự tạo theo ý muốn của bạn. Ngoài ra còn nhiều nội dung hấp dẫn hơn nữa. Xem chi tiết tại: