Chào các anh em trong diễn đàn,
Dạo này công việc của mình liên quan nhiều đến việc xử lý dữ liệu trên Excel, đặc biệt là việc lọc và sao chép dữ liệu từ một file lớn sang một file khác dựa trên nhiều tiêu chí khác nhau. Trước đây mình hay làm thủ công bằng tay hoặc dùng các bộ lọc có sẵn của Excel, nhưng với lượng dữ liệu ngày càng tăng và các điều kiện lọc ngày càng phức tạp, cách này tốn rất nhiều thời gian và dễ sai sót.
Mình đã thử tìm hiểu và viết một đoạn code VBA để tự động hóa quá trình này. Ý tưởng cơ bản là mình sẽ định nghĩa các điều kiện lọc trong một bảng tính phụ, sau đó dùng VBA để đọc các điều kiện này và tiến hành lọc dữ liệu từ file nguồn, cuối cùng sao chép các dòng thỏa mãn điều kiện sang file đích.
Ví dụ, mình có một file chứa danh sách khách hàng với các cột như: Tên khách hàng, Ngày đăng ký, Loại dịch vụ, Trạng thái, Khu vực. Mình muốn lọc ra những khách hàng đã đăng ký trong Quý 1 năm 2023, sử dụng dịch vụ 'Premium', có trạng thái 'Active' và thuộc khu vực 'Miền Nam'.
Đoạn code mình viết có thể xử lý được các điều kiện này một cách linh hoạt. Mình đang muốn chia sẻ kinh nghiệm này với mọi người và cũng muốn hỏi xem liệu có anh em nào có cách tiếp cận khác hoặc có những hàm/thủ thuật VBA nào hay hơn để xử lý trường hợp này không?
Code của mình đại khái như sau:
Sub LocDuLieuTheoDieuKien() ' Khai báo biến Dim wsNguon As Worksheet, wsDich As Worksheet, wsDieuKien As Worksheet Dim lastRowNguon As Long, lastRowDich As Long Dim i As Long, j As Long ' Khai báo các biến điều kiện Dim ngayDK1 As Date, ngayDK2 As Date Dim loaiDV As String Dim trangThai As String Dim khuVuc As String ' Thiết lập các sheet Dim wsNguon = ThisWorkbook.Sheets("DuLieuGoc") Dim wsDich = ThisWorkbook.Sheets("KetQua") Dim wsDieuKien = ThisWorkbook.Sheets("DieuKienLoc") ' Đọc các điều kiện từ sheet 'DieuKienLoc' ngayDK1 = wsDieuKien.Range("B2").Value ngayDK2 = wsDieuKien.Range("C2").Value loaiDV = wsDieuKien.Range("D2").Value trangThai = wsDieuKien.Range("E2").Value khuVuc = wsDieuKien.Range("F2").Value ' Xóa dữ liệu cũ trên sheet 'KetQua' wsDich.Cells.ClearContents ' Lấy dòng cuối cùng của dữ liệu nguồn lastRowNguon = wsNguon.Cells(Rows.Count, "A").End(xlUp).Row ' Lặp qua từng dòng dữ liệu nguồn For i = 2 To lastRowNguon ' Kiểm tra các điều kiện If wsNguon.Cells(i, "B").Value >= ngayDK1 And wsNguon.Cells(i, "B").Value