HỖ TRỢ VIẾT CODE VBA LỌC DỮ LIỆU NHIỀU ĐIỀU KIỆN TRONG BẢNG TÍNH

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

hoatuongvi2022

Thành viên mới
Tham gia
9/12/22
Bài viết
8
Được thích
1
Hi ACE hội GPE!
Mình có bảng dữ liệu excel đính kèm cần lọc nhiều điều kiện, mà không biết viết code như thế nào để lọc các điều kiện cho chạy được.
Nhờ ACE chỉ giúp.
Xin cảm ơn nhiều!
P/s: File đính kèm
 

File đính kèm

  • Loc du lieu_ nhieu dieu kien.xlsx
    10.7 KB · Đọc: 32
Hi ACE hội GPE!
Mình có bảng dữ liệu excel đính kèm cần lọc nhiều điều kiện, mà không biết viết code như thế nào để lọc các điều kiện cho chạy được.
Nhờ ACE chỉ giúp.
Xin cảm ơn nhiều!
P/s: File đính kèm
Yêu cầu tự động lọc của bạn ghi trong file là không thể làm được với tất cả bởi code không thể biết đến điều kiện nào thì dừng. Do vậy phải có nút bấm để chạy sau khi đã nhập xong tất cả các điều kiện.
 
Upvote 0
Xem file nhé.
Cách dùng
Các ô màu vàng D3,D4,F3,F4 có thể nhập dữ liệu hoặc để trống
Nếu D3 trống: ngày bắt đầu là ngày nhỏ nhất
Nếu D4 trống: ngày kết thúc là ngày lớn nhất
F3,F4 có thể để trống, nếu không xét.
F4: có thể nhập ký tự đại diện (vd: Nhập "THỊ" thì lọc hết các tên có THỊ)
Code này đặt trong sheet module, bắt sự kiện thay đổi của 4 ô
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr&, i&, rng, tmp(), bd As Double, kt As Double, mh, nv
Application.ScreenUpdating = False
If Intersect(Target, Range("D3,D4,F3,F4")) Is Nothing Then Exit Sub
Range("A7:A100000").EntireRow.Hidden = False
bd = Range("D3").Value2: kt = Range("D4").Value2
mh = Range("F3").Value: nv = Range("F4").Value
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A7:D" & lr).Value2
ReDim tmp(1 To UBound(rng), 1 To 1)
For i = 1 To UBound(rng)
    If rng(i, 2) >= bd And rng(i, 2) <= IIf(kt = 0, 100 ^ 100, kt) And _
    rng(i, 3) = IIf(mh = "", rng(i, 3), mh) And UCase(rng(i, 4)) Like IIf(nv = "", "*", "*" & UCase(nv) & "*") Then
        tmp(i, 1) = rng(i, 1)
    Else: tmp(i, 1) = ""
    End If
Next
With Range("XX7")
    .Resize(10000, 1).ClearContents
    .Resize(UBound(rng), 1).Value = tmp
    On Error Resume Next
    .Resize(UBound(rng), 1).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    .Resize(10000, 1).ClearContents
End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Loc du lieu_ nhieu dieu kien.xlsm
    18.5 KB · Đọc: 37
Upvote 0
Xem file nhé.
Cách dùng
Các ô màu vàng D3,D4,F3,F4 có thể nhập dữ liệu hoặc để trống
Nếu D3 trống: ngày bắt đầu là ngày nhỏ nhất
Nếu D4 trống: ngày kết thúc là ngày lớn nhất
F3,F4 có thể để trống, nếu không xét.
F4: có thể nhập ký tự đại diện (vd: Nhập "THỊ" thì lọc hết các tên có THỊ)
Code này đặt trong sheet module, bắt sự kiện thay đổi của 4 ô
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr&, i&, rng, tmp(), bd As Double, kt As Double, mh, nv
Application.ScreenUpdating = False
If Intersect(Target, Range("D3,D4,F3,F4")) Is Nothing Then Exit Sub
Range("A7:A100000").EntireRow.Hidden = False
bd = Range("D3").Value2: kt = Range("D4").Value2
mh = Range("F3").Value: nv = Range("F4").Value
lr = Cells(Rows.Count, "B").End(xlUp).Row
rng = Range("A7:D" & lr).Value2
ReDim tmp(1 To UBound(rng), 1 To 1)
For i = 1 To UBound(rng)
    If rng(i, 2) >= bd And rng(i, 2) <= IIf(kt = 0, 100 ^ 100, kt) And _
    rng(i, 3) = IIf(mh = "", rng(i, 3), mh) And UCase(rng(i, 4)) Like IIf(nv = "", "*", "*" & UCase(nv) & "*") Then
        tmp(i, 1) = rng(i, 1)
    Else: tmp(i, 1) = ""
    End If
Next
With Range("XX7")
    .Resize(10000, 1).ClearContents
    .Resize(UBound(rng), 1).Value = tmp
    On Error Resume Next
    .Resize(UBound(rng), 1).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    .Resize(10000, 1).ClearContents
End With
Application.ScreenUpdating = True
End Sub
Cảm ơn bạn rất nhiều! code chạy nhanh mượt lắm.
 
Upvote 0
Đơn giản là dùng Power pivot hoặc Power Bi, đại loại mấy tool kiểu vậy, slicer trên đó nó tự lọc cho bạn, ngôn ngữ kéo thả, không cần phải hiểu code:
1676014849624.png
 
Upvote 0
Hi ACE hội GPE!
Mình có bảng dữ liệu excel đính kèm cần lọc nhiều điều kiện, mà không biết viết code như thế nào để lọc các điều kiện cho chạy được.
Nhờ ACE chỉ giúp.
Xin cảm ơn nhiều!
P/s: File đính kèm
Không viết hoa toàn bộ tiêu đề nhé bạn, một cách làm khác bạn tham khảo:

Mã:
Option Explicit

Sub FilterData()

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    Dim startDate As Date, endDate As Date
    Dim LastRow  As Long
      
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=""Excel 12.0 Macro;HDR=YES"";"
            
    LastRow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row
    If LastRow < 7 Then GoTo End_
    
    startDate = Sheet1.Range("D3")
    endDate = Sheet1.Range("D4")
    If startDate = 0 Or endDate = 0 Or endDate < startDate Then GoTo End_
    
    strSQL = "SELECT * FROM [Sheet1$A6:F" & LastRow & "] " & _
             "WHERE [NGAY_THANG] BETWEEN #" & startDate & "# AND #" & endDate & "#" & _
             " AND [MAT_HANG] Like '%" & Sheet1.Range("F3") & "%'" & _
             " AND [NHAN_VIEN] Like '%" & Sheet1.Range("F4") & "%'"
    

    rs.Open strSQL, cn
    Sheet1.Range("I7").Resize(10000, 6).ClearContents
    Sheet1.Range("I7").CopyFromRecordset rs
    
End_:
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    
End Sub
 

File đính kèm

  • Loc du lieu_ nhieu dieu kien.xlsm
    24 KB · Đọc: 20
Upvote 0
Không viết hoa toàn bộ tiêu đề nhé bạn, một cách làm khác bạn tham khảo:

Mã:
Option Explicit

Sub FilterData()

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    Dim startDate As Date, endDate As Date
    Dim LastRow  As Long
     
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=""Excel 12.0 Macro;HDR=YES"";"
           
    LastRow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row
    If LastRow < 7 Then GoTo End_
   
    startDate = Sheet1.Range("D3")
    endDate = Sheet1.Range("D4")
    If startDate = 0 Or endDate = 0 Or endDate < startDate Then GoTo End_
   
    strSQL = "SELECT * FROM [Sheet1$A6:F" & LastRow & "] " & _
             "WHERE [NGAY_THANG] BETWEEN #" & startDate & "# AND #" & endDate & "#" & _
             " AND [MAT_HANG] Like '%" & Sheet1.Range("F3") & "%'" & _
             " AND [NHAN_VIEN] Like '%" & Sheet1.Range("F4") & "%'"
   

    rs.Open strSQL, cn
    Sheet1.Range("I7").Resize(10000, 6).ClearContents
    Sheet1.Range("I7").CopyFromRecordset rs
   
End_:
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
   
End Sub
Lâu rồi mới thấy chị OT xuất hiện !
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom