Lọc dữ liệu bằng VBA

Liên hệ QC

vanlan_ks

Thành viên chính thức
Tham gia
8/8/12
Bài viết
67
Được thích
8
Nhờ a / c lọc sheet sang giúp dữ liệu bằng VBA.
do yêu cầu lọc sang sheet và copy sang sheet khác hiển thị một số cột cần thiết thôi.
 

File đính kèm

  • Loc du lieu.xlsx
    12.4 KB · Đọc: 22

File đính kèm

  • Loc du lieu(cuaVanLan).xlsm
    23.7 KB · Đọc: 48
Thu xem. Hay thay doi o C2 va xem ket qua
Bạn nên thêm hàm Ucase chỗ biến DK và so sánh mã số phòng trường hợp gõ Vp thì không có kết quả.
Và chỗ
Mã:
If t Then Sheet2.[A5].Resize(t, 10) = KQ
Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
sửa thành
Mã:
If t Then 
     Sheet2.[A5].Resize(t, 10) = KQ
     Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
end if
Chứ nếu t=0 thì dòng Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy" bị lỗi
 
Bạn nên thêm hàm Ucase chỗ biến DK và so sánh mã số phòng trường hợp gõ Vp thì không có kết quả.
Và chỗ
Mã:
If t Then Sheet2.[A5].Resize(t, 10) = KQ
Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
sửa thành
Mã:
If t Then
     Sheet2.[A5].Resize(t, 10) = KQ
     Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
end if
Chứ nếu t=0 thì dòng Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy" bị lỗi
A cho e xin file đã sửa lại như trên giúp
 
A cho e xin file đã sửa lại như trên giúp
Code đã sửa:
Rich (BB code):
Sub LOC()
    Dim j&, Lr&, t&, k&
    Dim Arr(), S, tmp, DK
    Lr = Sheet1.Cells(Rows.Count, 1).End(3).Row
    Arr = Sheet1.Range("A4:P" & Lr).Value
    ReDim KQ(1 To UBound(Arr), 1 To 10)
    DK = UCase(Sheet2.Cells(2, 3))
    For j = 1 To UBound(Arr)
        If UCase(Arr(j, 5)) = DK Then
            t = t + 1
            KQ(t, 1) = t
            For k = 2 To 7
                KQ(t, k) = Arr(j, k)
            Next k
            KQ(t, 8) = Arr(j, 12)
            KQ(t, 9) = Arr(j, 14)
            KQ(t, 10) = Arr(j, 15)
        End If
    Next j
    If t Then
        Sheet2.[A5].Resize(t, 10) = KQ
        Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
    End If
End Sub
 
Code đã sửa:
Rich (BB code):
Sub LOC()
    Dim j&, Lr&, t&, k&
    Dim Arr(), S, tmp, DK
    Lr = Sheet1.Cells(Rows.Count, 1).End(3).Row
    Arr = Sheet1.Range("A4:P" & Lr).Value
    ReDim KQ(1 To UBound(Arr), 1 To 10)
    DK = UCase(Sheet2.Cells(2, 3))
    For j = 1 To UBound(Arr)
        If UCase(Arr(j, 5)) = DK Then
            t = t + 1
            KQ(t, 1) = t
            For k = 2 To 7
                KQ(t, k) = Arr(j, k)
            Next k
            KQ(t, 8) = Arr(j, 12)
            KQ(t, 9) = Arr(j, 14)
            KQ(t, 10) = Arr(j, 15)
        End If
    Next j
    If t Then
        Sheet2.[A5].Resize(t, 10) = KQ
        Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
    End If
End Sub
Cám ơn bạn nhiều
Bài đã được tự động gộp:

Làm sao để xoá kết quả cũ (lọc điều kiện trước vậy bạn).
 
Cám ơn bạn nhiều
Bài đã được tự động gộp:


Làm sao để xoá kết quả cũ (lọc điều kiện trước vậy bạn).
Thử code
Mã:
Sub ABC()
    Dim Arr(), Res(), i&, BP$, K&, X&
    With Sheets("DATA")
        Arr = .Range("A4:O" & .Range("B" & Rows.Count).End(3).Row).Value
    End With
    BP = Sheets("L-BO PHAN").Range("C2").Value
    ReDim Res(1 To UBound(Arr, 1), 1 To 10)
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 5) = BP Then
            K = K + 1
            Res(K, 1) = K
            For X = 2 To 7
                Res(K, X) = Arr(i, X)
            Next
            Res(K, 8) = Arr(i, 12)
            Res(K, 9) = Arr(i, 14)
            Res(K, 10) = Arr(i, 15)
        End If
    Next
    With Sheets("L-BO PHAN")
        .Range("A5:J1000").ClearContents
        If K Then .Range("A5").Resize(K, 10).Value = Res
    End With
End Sub
 
Try code
Mã:
 Sub ABC ()
    Dim Arr (), Res (), i &, BP $, K &, X &
    Với Trang tính ("DỮ LIỆU")
        Arr = .Range ("A4: O" & .Range ("B" & Rows.Count) .End (3) .Row). Giá trị
    Kết thúc với
    BP = Trang tính ("L-BO PHAN"). Phạm vi ("C2"). Giá trị
    ReDim Res (1 đến UBound (Arr, 1), 1 đến 10)
    Đối với i = 1 Đến UBound (Arr, 1)
        Nếu Arr (i, 5) = BP Thì
            K = K + 1
            Res (K, 1) = K
            Đối với X = 2 đến 7
                Res (K, X) = Arr (i, X)
            Kế tiếp
            Res (K, 8) = Arr (i, 12)
            Res (K, 9) = Arr (i, 14)
            Res (K, 10) = Arr (i, 15)
        Kết thúc nếu
    Kế tiếp
    Với Trang tính ("L-BO PHAN")
        .Range ("A5: J1000"). ClearContents
        If K Then .Range ("A5"). Thay đổi kích thước (K, 10) .Value = Res
    Kết thúc với
Kết thúc Sub
[/MÃ SỐ]
[/QUOTE]
Vâng cám ơn bạn đã giúp rất nhiều, mình mới chạy thử thấy ổn
 
Bạn nên thêm hàm Ucase chỗ biến DK và so sánh mã số phòng trường hợp gõ Vp thì không có kết quả.
Và chỗ
Mã:
If t Then Sheet2.[A5].Resize(t, 10) = KQ
Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
sửa thành
Mã:
If t Then
     Sheet2.[A5].Resize(t, 10) = KQ
     Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy"
end if
Chứ nếu t=0 thì dòng Sheet2.[H5].Resize(t).NumberFormat = "mm/dd/yyyy" bị lỗi
Cảm ơn anh đã chỉ giáo và cho tôi một kinh nghiệm quý báu.
 
Bài này dùng công cụ Advanced Filter cũng rất tuyệt vời mà, bạn thử nhé
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C2]) Is Nothing Then
   Rows("5:1000").Clear
   Sheet1.[B3:Q10000].AdvancedFilter 2, [C1:C2], [B4:J4]
   [A4].CurrentRegion.Borders.Value = 1
   If [B5] <> "" Then Range([B5], [B65536].End(3)).Offset(, -1) = [row(a:a)]
End If
End Sub
 

File đính kèm

  • AdvancetFilter.xlsm
    20.3 KB · Đọc: 42
Cám ơn bạn nhiều
Bài đã được tự động gộp:


Làm sao để xoá kết quả cũ (lọc điều kiện trước vậy bạn).
Gửi lại bạn File đã sửa code theo gợi ý của anh Maika8008. Trong file đã làm thêm cho bạn Data validation ở ô C2. khi click chọn kết quả sẽ được thể hiện bên dưới.
 

File đính kèm

  • Loc du lieu(cuaVanLan).xlsm
    23.3 KB · Đọc: 19
Tạo một slicer trong Pivot là được rồi. Công việc này cần gì code kiếc cho phức tạp bạn:
1630198173383.png
 

File đính kèm

  • 1630198138659.png
    1630198138659.png
    202.7 KB · Đọc: 7
Nói chung một bài toán sẽ có nhiều cách giải.
Tuy nhiên, nếu chủ topic mới làm quen với VBA, cùng với dữ liệu đầu vào khá đẹp này thì trước mắt nên thử với công cụ Advanced Filter.
Đầu tiên làm bằng tay từng bước, sau đó record macro lại, thế là có đoạn code VBA cho riêng mình.
Chúc thành công !!!
 
Gửi lại bạn File đã sửa code theo gợi ý của anh Maika8008. Trong file đã làm thêm cho bạn Data validation ở ô C2. khi click chọn kết quả sẽ được thể hiện bên dưới.
Anh cho hỏi, giờ muốn thay đổi cột lọc dữ liệu thì mình phải sửa code như thế nào (e tùy biến theo dữ liệu của mình).
Giả sử em lọc cột Trình độ NV.
Cám ơn
 
Anh cho hỏi, giờ muốn thay đổi cột lọc dữ liệu thì mình phải sửa code như thế nào (e tùy biến theo dữ liệu của mình).
Giả sử em lọc cột Trình độ NV.
Cám ơn
Với File bài #10
ô C1 bản sửa thành Trình độ NV
ô C2 Clear Data Validation (vì đang là Validation cho Bộ phận), xong nhập trình độ muốn lọc vào C2 => xong.

Snag_9dd7371.png
 
Anh cho hỏi, giờ muốn thay đổi cột lọc dữ liệu thì mình phải sửa code như thế nào (e tùy biến theo dữ liệu của mình).
Giả sử em lọc cột Trình độ NV.
Cám ơn
Taọ 01 validation rồi sửa đoạn này!
If Arr(j, 9) = DK Then Thay số 5 thành số 9.
 

File đính kèm

  • Loc du lieu(cuaVanLan).xlsm
    24.5 KB · Đọc: 12
Taọ 01 validation rồi sửa đoạn này!
If Arr(j, 9) = DK Then Thay số 5 thành số 9.
Dùng mảng để lọc với bài này là giải pháp tốt, tuy nhiên mà tác giả muốn đảo vị trí các cột kết quả, bổ sung thêm trường và một vài điều kiện lọc nữa thì sửa code cũng khá nhọc.
 
Taọ 01 validation rồi sửa đoạn này!
If Arr(j, 9) = DK Then Thay số 5 thành số 9.
Em còn một vấn đề nữa là nếu điều kiện lọc là số thì không ra được kết quả, không chạy được.
Vì máy dùng chung nhiều người, một số thì biết chút ít excel nên lọc thủ công được, số còn lại không làm được, nên e trích lọc sang sheet khác là vậy. E dùng công thức nhưng chạy chậm quá nên nhờ giúp VBA.
Trân trọng cám ơn
 
Em còn một vấn đề nữa là nếu điều kiện lọc là số thì không ra được kết quả, không chạy được.
Vì máy dùng chung nhiều người, một số thì biết chút ít excel nên lọc thủ công được, số còn lại không làm được, nên e trích lọc sang sheet khác là vậy. E dùng công thức nhưng chạy chậm quá nên nhờ giúp VBA.
Trân trọng cám ơn
bạn muốn lọc gì? bạn gửi yêu cầu lên đi.
 
Em còn một vấn đề nữa là nếu điều kiện lọc là số thì không ra được kết quả, không chạy được.
Vì máy dùng chung nhiều người, một số thì biết chút ít excel nên lọc thủ công được, số còn lại không làm được, nên e trích lọc sang sheet khác là vậy. E dùng công thức nhưng chạy chậm quá nên nhờ giúp VBA.
Trân trọng cám ơn
Yêu cầu của bạn cụ thể như thế nào?
Bạn nên mở một chủ để mới và hỏi cụ thể hơn, đừng chèn vào Topic của người khác.
 
Web KT
Back
Top Bottom