Hoàng Nhật Phương
Thành viên gắn bó



- Tham gia
- 5/11/15
- Bài viết
- 1,895
- Được thích
- 1,219
Xin chào befaint,Thông thường lọc trên bảng tính/ form như vậy thì không nhập gì = lấy tất cả.
View attachment 252158
Bài này nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheetXin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
Cảm ơn bạn đã quan tâm, nếu có thể nhờ bạn giúp đỡ OT theo cách này với ạ:Bài này nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet
Còn nếu là thông thường thì dường như không lọc được, nếu muốn thì tìm hiểu thêm về advanced filter
Product Category có nhiều giá trị giống customer không bạnCảm ơn bạn đã quan tâm, nếu có thể nhờ bạn giúp đỡ OT theo cách này với ạ:
" nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet"
Có bạn ạ, mỗi giá trị ngăn cách nhau bởi dấu ";" bạn ạProduct Category có nhiều giá trị giống customer không bạn
Option Explicit
Private Function CheckCriteria(ByVal strChecking As String, ByVal strCriteria As String, _
Optional ByVal blnMatchCase As Boolean = False) As Boolean
'Tra ve True neu tim thay chuoi dieu kien trong strChecking'
'strChecking: Chuoi can kiem tra'
'strCriteria: Chuoi chua cac dieu kien loc'
' Neu khong nhap gi (strCriteria = Empty) tuc la thoa moi dieu kien'
'blnMatchCase: True - phan biet chu hoa/ thuong va nguoc lai. Mac dinh False '
Const strDeli = ";"
Dim item As Variant, strFind As String, MatchCase As VbCompareMethod
If Len(strCriteria) = 0 Then CheckCriteria = True: Exit Function
If blnMatchCase = False Then MatchCase = vbTextCompare Else MatchCase = vbBinaryCompare
For Each item In VBA.Split(strCriteria, strDeli)
strFind = item
If InStr(1, strChecking, strFind, MatchCase) > 0 Then
CheckCriteria = True
Exit For
End If
Next item
End Function
Bác befaint lẹ quá mà 4h mình tan ca rồi nên nếu chưa ổn thì tối mình mới xem giúp bạn được, bạn thông cảm nhé. (mình mới viết được nửa đườngCó bạn ạ, mỗi giá trị ngăn cách nhau bởi dấu ";" bạn ạ
Dùng Power queryXin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
Bạn thử code nếu lọc tất cả thì bỏ trống nhé.Xin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
Sub loc()
Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String
Dim m As Boolean, n As Boolean, k As Integer, j As Integer
With Sheets("Orders")
lr = .Range("H" & Rows.Count).End(xlUp).Row
arr = .Range("A2:J" & lr).Value
ReDim kq(1 To UBound(arr), 1 To 10)
End With
With Sheets("Filter")
T1 = Split(";" & .Range("b1").Value, ";")
T2 = Split(";" & .Range("b2").Value, ";")
b = UBound(T1)
c = UBound(T2)
For i = 1 To UBound(arr)
dk = arr(i, 8)
dks = arr(i, 10)
m = False: n = False
For k = 1 To b
If InStr(dk, T1(k)) Then
m = True
Exit For
End If
Next k
For k = 1 To c
If InStr(dks, T2(k)) Then
n = True
Exit For
End If
Next k
If m = True And n = True Then
a = a + 1
For j = 1 To 10
kq(a, j) = arr(i, j)
Next j
End If
Next i
lr = .Range("H" & Rows.Count).End(xlUp).Row
If lr > 3 Then .Range("A4:J" & lr).ClearContents
If a Then .Range("A4:J4").Resize(a).Value = kq
End With
End Sub
Dạ OT muốn sử dụng VBA bài này Bạn ạ, cảm ơn bạn nhiều.Dùng Power query
Cảm ơn befaint, OT sẽ code thử 1 sub để ứng dụng hàm "CheckCriteria" của Bạn ạ.PHP:Option Explicit Private Function CheckCriteria(ByVal strChecking As String, ByVal strCriteria As String, _ Optional ByVal blnMatchCase As Boolean = False) As Boolean 'Tra ve True neu tim thay chuoi dieu kien trong strChecking' 'strChecking: Chuoi can kiem tra' 'strCriteria: Chuoi chua cac dieu kien loc' ' Neu khong nhap gi (strCriteria = Empty) tuc la thoa moi dieu kien' 'blnMatchCase: True - phan biet chu hoa/ thuong va nguoc lai. Mac dinh False ' Const strDeli = ";" Dim item As Variant, strFind As String, MatchCase As VbCompareMethod If Len(strCriteria) = 0 Then CheckCriteria = True: Exit Function If blnMatchCase = False Then MatchCase = vbTextCompare Else MatchCase = vbBinaryCompare For Each item In VBA.Split(strCriteria, strDeli) strFind = item If InStr(1, strChecking, strFind, MatchCase) > 0 Then CheckCriteria = True Exit For End If Next item End Function
Áp dụng đại khái:
- Giả sử lọc không phân biệt chữ hoa/ thường
- Điều kiện ban đầu: dk1 = B1, dk2 = B2
- Chép bảng dữ liệu vào mảng.
- Xét các phần tử mảng:
ten_khach=...
loại_hang=...
If CheckCriteria(ten_khach, dk1) = True then
If CheckCriteria(loại_hang, dk2) = True then
'lấy dữ liệu vào mảng kết quả
End If
End If
Xin chào snow25,Bạn thử code nếu lọc tất cả thì bỏ trống nhé.
Mã:Sub loc() Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String Dim m As Boolean, n As Boolean, k As Integer, j As Integer With Sheets("Orders") lr = .Range("H" & Rows.Count).End(xlUp).Row arr = .Range("A2:J" & lr).Value ReDim kq(1 To UBound(arr), 1 To 10) End With With Sheets("Filter") T1 = Split(";" & .Range("b1").Value, ";") T2 = Split(";" & .Range("b2").Value, ";") b = UBound(T1) c = UBound(T2) For i = 1 To UBound(arr) dk = arr(i, 8) dks = arr(i, 10) m = False: n = False For k = 1 To b If InStr(dk, T1(k)) Then m = True Exit For End If Next k For k = 1 To c If InStr(dks, T2(k)) Then n = True Exit For End If Next k If m = True And n = True Then a = a + 1 For j = 1 To 10 kq(a, j) = arr(i, j) Next j End If Next i lr = .Range("H" & Rows.Count).End(xlUp).Row If lr > 3 Then .Range("A4:J" & lr).ClearContents If a Then .Range("A4:J4").Resize(a).Value = kq End With End Sub
Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.Dạ OT muốn sử dụng VBA bài này Bạn ạ, cảm ơn bạn nhiều.
Bài đã được tự động gộp:
Cảm ơn befaint, OT sẽ code thử 1 sub để ứng dụng hàm "CheckCriteria" của Bạn ạ.
Xin chào snow25,
Code này của bạn OT copy về xóa dữ liệu cũ ở sheet finter trước sau đó chạy code thì không xuất hiện kết quả ? ở sheet Oders OT cũng bỏ lọc rồi Bạn ạ.
Cảm ơn @snow25 nhiều ạ,Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.
A! OT xử lý được rồi cảm ơn @snow25 nhiều ạ.Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.
...
T1 = Split(";" & UCase(.Range("b1").Value), ";")
T2 = Split(";" & UCase(.Range("b2").Value), ";")
...
dk = UCase(arr(i, 8))
dks = UCase(arr(i, 10))
...
Bạn tìm hiểu lại cấu trúc hàm instr xem sao, chỗ vbtextcompare với vbbinarycompare có thể sẽ gọn hơnCảm ơn @snow25 nhiều ạ,
OT xóa dấu "*" ở ô B2 kết quả OK rồi bạn ạ, bạn cho hỏi thêm nếu không phân biệt chữ hoa chữ thường thì xử lý những chỗ nào ạ?
Bài đã được tự động gộp:
A! OT xử lý được rồi cảm ơn @snow25 nhiều ạ.
Mã:... T1 = Split(";" & UCase(.Range("b1").Value), ";") T2 = Split(";" & UCase(.Range("b2").Value), ";") ... dk = UCase(arr(i, 8)) dks = UCase(arr(i, 10)) ...
Dạ thôi Bạn ạ, rẹt cái ra kết quả luôn là ưng lắm rồi ạ, còn gọn & đẹp thì để sau nếu cái đầu của OT nó được cải thiện hơn ạ.Bạn tìm hiểu lại cấu trúc hàm instr xem sao, chỗ vbtextcompare với vbbinarycompare có thể sẽ gọn hơn
Có cách nào bỏ 2 biến "m" và "n" không?Bạn thử code nếu lọc tất cả thì bỏ trống nhé.
Mã:Sub loc() Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String Dim m As Boolean, n As Boolean, k As Integer, j As Integer With Sheets("Orders") lr = .Range("H" & Rows.Count).End(xlUp).Row arr = .Range("A2:J" & lr).Value ReDim kq(1 To UBound(arr), 1 To 10) End With With Sheets("Filter") T1 = Split(";" & .Range("b1").Value, ";") T2 = Split(";" & .Range("b2").Value, ";") b = UBound(T1) c = UBound(T2) For i = 1 To UBound(arr) dk = arr(i, 8) dks = arr(i, 10) m = False: n = False For k = 1 To b If InStr(dk, T1(k)) Then m = True Exit For End If Next k For k = 1 To c If InStr(dks, T2(k)) Then n = True Exit For End If Next k If m = True And n = True Then a = a + 1 For j = 1 To 10 kq(a, j) = arr(i, j) Next j End If Next i lr = .Range("H" & Rows.Count).End(xlUp).Row If lr > 3 Then .Range("A4:J" & lr).ClearContents If a Then .Range("A4:J4").Resize(a).Value = kq End With End Sub
Con chào Bác @HieuCD ,Có cách nào bỏ 2 biến "m" và "n" không?![]()
Trời ạ, mình chỉ gợi ý code gọn và chạy nhanh hơn chút xíu mờCon chào Bác @HieuCD ,
Cảm ơn Bác đã quan tâm vấn đề của con ạ.
Bác mà tham gia, nhờ Bác xử lý giúp con thêm 2 điều kiện nữa lọc trong ô D1,D2,E2 theo cột "Order Date" & "Profit" với ạ:
Bắt lỗi điều kiện nếu có điều kiện trong ô D1 & D2 thì phải đủ cả 2 điều kiện từ ngày đến ngày và ngày trong ô D2 lớn hơn ngày trong ô D1thì mới code mới chạy ạ .
View attachment 252181
Dạ vầng Bác ơi, con cũng thấy cần thêm mấy chỗ đó ạ.Trời ạ, mình chỉ gợi ý code gọn và chạy nhanh hơn chút xíu mờ