Hướng dẫn code autofilter cho VBA

DoHuyCuong

Yêu THVBA
Chào mọi người!
Mình đang tự học code VBA để sử dụng cho công việc nhanh hơn.
Hiện tại giả sử mình có 1 file quản lý cấp phát dụng cụ cho nhiều nhân viên và cần kiểm kê hàng tháng.
Để kiểm kê mình cần lọc và in từng người ra 1 trang giấy (đầu tiên lọc theo nhóm, sau đó lọc từng người)
Một nhóm có thể có nhiều người. → vì vậy mình muốn viết code để khi lọc theo nhóm, sẽ in lần lượt từng người để kiểm kê dụng cụ. Mình đang bí code này. Mọi người giúp mình với
 

DoHuyCuong

Yêu THVBA
Chào mọi người!
Mình đang tự học code VBA để sử dụng cho công việc nhanh hơn.
Hiện tại giả sử mình có 1 file quản lý cấp phát dụng cụ cho nhiều nhân viên và cần kiểm kê hàng tháng.
Để kiểm kê mình cần lọc và in từng người ra 1 trang giấy (đầu tiên lọc theo nhóm, sau đó lọc từng người)
Một nhóm có thể có nhiều người. → vì vậy mình muốn viết code để khi lọc theo nhóm, sẽ in lần lượt từng người để kiểm kê dụng cụ. Mình đang bí code này. Mọi người giúp mình với
Mình cần giờ là dòng code lọc từng nhân viên. Thay vì gõ từng nhân viên mất nhiều thời gian thì có dòng code nào duyệt từng nhân viên hiện có trong nhóm không ạ?
 
H

haokira

Guest
Xuất mỗi nhân viên ra 1 file pdf được không bạn?
 

DoHuyCuong

Yêu THVBA
Xuất mỗi nhân viên ra 1 file pdf được không bạn?
Được bạn ạ!
Nói chung về lệnh xuất pdf hay in thì mình làm được rồi.
Nhưng hiện tại mình đang ko biết làm thế nào để tách từng nhân viên ra được bạn ạ.
Ví dụ có tới 100 nhân viên mà phải thao tác thủ công lọc 100 lần thì mất nhiều thời gian lắm! bạn xem giúp mình nhé!
 
H

haokira

Guest
Hướng suy nghĩ của mình là: Tạo 1 mảng lọc ra danh sách nhân viên, chạy vòng lặp và fillter theo đó thôi
 

sdfsfsfs

Yêu THVBA
Được bạn ạ!
Nói chung về lệnh xuất pdf hay in thì mình làm được rồi.
Nhưng hiện tại mình đang ko biết làm thế nào để tách từng nhân viên ra được bạn ạ.
Ví dụ có tới 100 nhân viên mà phải thao tác thủ công lọc 100 lần thì mất nhiều thời gian lắm! bạn xem giúp mình nhé!
Sao không làm cái lệnh in 1 phát xong luôn.
 
H

haokira

Guest
Bỏ cái suy nghĩ cái Filter đi.Đã dùng VBA lại còn thêm công cụ excel làm gì.
Mình đồng ý 1 phần quan điểm của bạn về công cụ excel như viết hàm công thức "=Sum(....)" trong vba.
Trường hợp filter hay advanced filter mình thấy trong nhiều trường hợp tốt hơn việc chạy vòng lặp để lấy giá trị thỏa mãn.
 

DoHuyCuong

Yêu THVBA
Hướng suy nghĩ của mình là: Tạo 1 mảng lọc ra danh sách nhân viên, chạy vòng lặp và fillter theo đó thôi
Vậy bạn gợi ý cho mình dòng code được không?
Mình tìm kiếm trên mạng suốt mấy tiếng ko thu được kết quả như ý muốn!
 

DoHuyCuong

Yêu THVBA
Sao không làm cái lệnh in 1 phát xong luôn.
Nhưng cái mình cần là 1 danh sách rất dài. Cấp phát theo thời gian. Với số nhân viên lớn + cấp dụng cụ cho nhân viên nhiều thì có thể tới vài trăm trang giấy. Như vậy bạn sẽ phải tra cứu rất lâu.
Nhưng nếu bạn in thông tin của từng nhóm , nhân viên thì việc kiểm kê sẽ nhanh hơn nhiều. Cũng như cập nhật sẽ dễ hơn
 

DoHuyCuong

Yêu THVBA
Đây là hướng mình muốn thực hiện.
Trường hợp 1: mình in toàn người của nhóm ME chẳng hạn. Điền cobobox nhóm ME sau đó kích lệnh in là toàn bộ các nhân viên thuộc nhóm ME sẽ được in / xuất ra (pdf hoặc in giấy A4).
Trường hợp 2: mình chỉ kiểm kê 1 dụng cụ của 1 nhân viên thôi. Cái này mình nghĩ là mình làm được rồi. Điền code (để cho ngắn ngọn) → ra tên nhân viên → lọc nhân viên đó ra rồi in.

Cái mình đang tắc là trường hợp 1. Làm thế nào để in toàn bộ thông tin từng người thuộc nhóm ME. Các bạn giúp mình nhé. Tks!!!
 

DoHuyCuong

Yêu THVBA
Bạn biết về mảng Array và dictionary không.
Mảng Array mình biết đôi chút. Cũng có ý định ép tên các nhân viên trong nhóm vào mảng. Sau đó dùng vòng lặp For để thực hiện.
Nhưng thao tác để add các nhân viên từ danh sách vào mảng thì hiện tại mình chưa biết hướng xử lý! bạn hướng dẫn mình được ko?
Hoặc có hướng nào giải quyết bạn chỉ giúp mình!

Còn dictionary thì mình mới đọc qua, chưa có thực hành và sử dụng nó bao giờ!
 
D

Deleted member 1392

Guest
Cho cái file lên thử bạn, hình ảnh bạn gởi nó bị gì ấy xem hết dc rồi. Mình làm dc làm cho
 

DoHuyCuong

Yêu THVBA
Cho cái file lên thử bạn, hình ảnh bạn gởi nó bị gì ấy xem hết dc rồi. Mình làm dc làm cho
Mình up lên mediafire được ko? Bạn xem giúp nhé!
Note: mình đang làm demo lên nhân viên ít. Chứ phòng của mình nhân viên nhiều, mỗi nhân viên được cấp nhiều dụng cụ bạn nhé!
 
D

Deleted member 1392

Guest
Do không biết Data sau khi lọc của bạn để đâu nên mình tạo Sheet mới tên "Print" nhé.
Code nút Print của bạn. Mình cũng đã code việc in liên tục hay xuất ra PDF cho bạn. Nếu xuất ra PDF thì nó sẽ lưu ở địa chỉ cùng vị trí lưu file của bạn với cấu trúc: "Tên nhân viên" - "Nhóm". Bạn có thể chỉnh lại vị trí lưu PDF, tên file và cấu hình in cho đúng ý bạn nhé.

Mã:
Private Sub BNT_Print_Click()
Dim arrData, arrFilterData As Variant
Dim lr, iCount, i, j, k As Long
Dim Dic As Object
Dim sKey, myFile As String

Set Dic = CreateObject("Scripting.Dictionary")

'//BAY LOI
If ComboBox1_Print.Value = "" Then
    MsgBox "Input error", vbOKOnly
    Exit Sub
End If

'//INPUT
With ThisWorkbook.Sheets("File Quan Ly")
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
    arrData = .Range("A2:M" & lr).Value
 
End With

'//PROCESS
'//VONG LAP MANG DE KIEM TRA DIC
Application.ScreenUpdating = False
For i = LBound(arrData, 1) To UBound(arrData, 1)

    ReDim arrFilterData(1 To UBound(arrData, 2), 1 To 1)
 
    '//CHECK DIEU KIEN NHOM
    sKey = arrData(i, 3)
    If Dic.exists(sKey) = False And arrData(i, 5) = ComboBox1_Print.Value Then
        '//VONG LAP DE NAP MANG
        For k = LBound(arrData, 1) To UBound(arrData, 1)
            '//KIEM TRA DIEU KIEN NHOM VA TEN NHAN VIEN
            If arrData(k, 3) = sKey And arrData(k, 5) = ComboBox1_Print.Value Then
                iCount = iCount + 1
                '//TANG KICH THUOC MANG NAP
                ReDim Preserve arrFilterData(1 To UBound(arrData, 2), 1 To iCount)
                '//VONG LAP COT MANG
                For j = LBound(arrData, 2) To UBound(arrData, 2)
                    arrFilterData(j, iCount) = arrData(i, j)
                Next j
            End If
        Next k
     
        '//RESET DU LIEU, CHUAN BI CHO VONG LAP MOI
        Dic.Add sKey, sKey
        iCount = 0
     
        '//DAO CHIEU MANG
        arrFilterData = WorksheetFunction.Transpose(arrFilterData)

        '//OUTPUT
        With ThisWorkbook.Sheets("Print")
            '//BAY LOI
            lr = .Cells(.Rows.Count, "A").End(xlUp).Row
            If lr = 1 Then lr = 2
            .Range("A2:M" & lr).ClearContents
            '//NAP VAO SHEET
            .Range("A2:M" & UBound(arrFilterData, 1) + 1) = arrFilterData
            .Activate
         
         
            ''----------------------------------
            '//LENH IN CUA BAN
            '//NEU CHON IN A4
            If OptionButton2.Value = True Then
                 '//CHINH CAU HINH IN O DAY
                ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
         
            '//NEU CHON IN PDF
            ElseIf OptionButton1.Value = True Then
                '//CHINH VỊ TRÍ LƯU PDF VÀ TÊN FILE Ở ĐÂY
                myFile = ThisWorkbook.Path & "\" & sKey & " - " & ComboBox1_Print.Value & ".pdf"
             
                .ExportAsFixedFormat Type:=xlTypePDF, Filename:=myFile
            End If
            ''----------------------------------
         
        End With
    End If
Next i

Application.ScreenUpdating = True

MsgBox "Complete" '//THONG BAO

End Sub
File của bạn:
 
Sửa lần cuối bởi điều hành viên:

DoHuyCuong

Yêu THVBA
Do không biết Data sau khi lọc của bạn để đâu nên mình tạo Sheet mới tên "Print" nhé.
Code nút Print của bạn. Mình cũng đã code việc in liên tục hay xuất ra PDF cho bạn. Nếu xuất ra PDF thì nó sẽ lưu ở địa chỉ cùng vị trí lưu file của bạn với cấu trúc: "Tên nhân viên" - "Nhóm". Bạn có thể chỉnh lại vị trí lưu PDF, tên file và cấu hình in cho đúng ý bạn nhé.

Mã:
Private Sub BNT_Print_Click()
Dim arrData, arrFilterData As Variant
Dim lr, iCount, i, j, k As Long
Dim Dic As Object
Dim sKey, myFile As String

Set Dic = CreateObject("Scripting.Dictionary")

'//BAY LOI
If ComboBox1_Print.Value = "" Then
    MsgBox "Input error", vbOKOnly
    Exit Sub
End If

'//INPUT
With ThisWorkbook.Sheets("File Quan Ly")
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
    arrData = .Range("A2:M" & lr).Value

End With

'//PROCESS
'//VONG LAP MANG DE KIEM TRA DIC
Application.ScreenUpdating = False
For i = LBound(arrData, 1) To UBound(arrData, 1)

    ReDim arrFilterData(1 To UBound(arrData, 2), 1 To 1)

    '//CHECK DIEU KIEN NHOM
    sKey = arrData(i, 3)
    If Dic.exists(sKey) = False And arrData(i, 5) = ComboBox1_Print.Value Then
        '//VONG LAP DE NAP MANG
        For k = LBound(arrData, 1) To UBound(arrData, 1)
            '//KIEM TRA DIEU KIEN NHOM VA TEN NHAN VIEN
            If arrData(k, 3) = sKey And arrData(k, 5) = ComboBox1_Print.Value Then
                iCount = iCount + 1
                '//TANG KICH THUOC MANG NAP
                ReDim Preserve arrFilterData(1 To UBound(arrData, 2), 1 To iCount)
                '//VONG LAP COT MANG
                For j = LBound(arrData, 2) To UBound(arrData, 2)
                    arrFilterData(j, iCount) = arrData(i, j)
                Next j
            End If
        Next k
   
        '//RESET DU LIEU, CHUAN BI CHO VONG LAP MOI
        Dic.Add sKey, sKey
        iCount = 0
   
        '//DAO CHIEU MANG
        arrFilterData = WorksheetFunction.Transpose(arrFilterData)

        '//OUTPUT
        With ThisWorkbook.Sheets("Print")
            '//BAY LOI
            lr = .Cells(.Rows.Count, "A").End(xlUp).Row
            If lr = 1 Then lr = 2
            .Range("A2:M" & lr).ClearContents
            '//NAP VAO SHEET
            .Range("A2:M" & UBound(arrFilterData, 1) + 1) = arrFilterData
            .Activate
       
       
            ''----------------------------------
            '//LENH IN CUA BAN
            '//NEU CHON IN A4
            If OptionButton2.Value = True Then
                 '//CHINH CAU HINH IN O DAY
                ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
       
            '//NEU CHON IN PDF
            ElseIf OptionButton1.Value = True Then
                '//CHINH VỊ TRÍ LƯU PDF VÀ TÊN FILE Ở ĐÂY
                myFile = ThisWorkbook.Path & "\" & sKey & " - " & ComboBox1_Print.Value & ".pdf"
           
                .ExportAsFixedFormat Type:=xlTypePDF, Filename:=myFile
            End If
            ''----------------------------------
       
        End With
    End If
Next i

Application.ScreenUpdating = True

MsgBox "Complete" '//THONG BAO

End Sub
File của bạn:
Tks bạn rất nhiều!

Mặc dù code không hoạt động đúng do chỉ nhận giá trị đầu tiên thôi, nhưng bạn đã cho mình hướng giải quyết! như vậy là tốt lắm rồi!
 
D

Deleted member 1392

Guest
Chỉ nhận giá trị đầu tiên là sao bạn ?. Code hoạt động hoàn toàn khớp với yêu cầu bạn đưa ra mà?.

P/s: Bạn @ rồi ghi tên mình là dc, không cần Quote cả bài viết đâu
 

Euler

Administrator
Thành viên BQT
Dictionary thì mình chấm 8 điểm.
ADO thì chấm 10 điểm.
 
Top