LamNA
Thành viên tích cực


- Tham gia
- 3/6/14
- Bài viết
- 897
- Được thích
- 725
- Giới tính
- Nam
- Nghề nghiệp
- Quản Lý Cửa Hàng
Thử:Chào anh chị GPE
Em đang có 1 file lọc dữ liệu nhưng hiện tại chỉ lọc được 1 điều kiện, nhờ anh chị hỗ trợ code có thể thỏa mãn nhiều điều kiện lọc tương ứng từ 1 - 13 của sheet DATA
Em cám ơn
Sub Loc()
With Sheets("DATA").Range("A2:M2")
.AutoFilter
.AutoFilter Field:=4, Criteria1:="123"
.AutoFilter Field:=12, Criteria1:="PK"
.Range("A2").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy Sheets("VBA").Range("A3")
.AutoFilter
End With
End Sub
Vâng em xin giải thích thêmViết thêm bài nữa nếu không lại có nhiều người thử làm bài...
- Chủ thớt là người muốn và muốn dùng code đang có trong file (vì đang mần cái này) nên Advanced Filter tạm gác.
- Chủ thớt cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<> ứng với các tiêu chí nhập vào.
Sub LocTest()
Dim sArr(), Arr, i As Long, J As Long, K As Long, r As Long, Col As Long, DK As Range, Cll As Range
With Sheets("DATA")
sArr = .Range("A1", .Range("A3").End(xlDown)).Resize(, .Range("A1").End(xlToRight).Column).Value
r = UBound(sArr)
Arr = Sheets("VBA").Range("A1", Sheets("VBA").Range("A1").End(xlToRight)).Value
Col = UBound(Arr, 2)
End With
ReDim dArr(1 To r, 1 To Col)
Set DK = Sheets("VBA").Range("O2:O14")
With CreateObject("Scripting.Dictionary")
For Each Cll In DK
If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
Next Cll
For i = 1 To r
If .Exists(UCase(sArr(i, 4))) Then 'Lọc cột 4 của sheet"DATA" với điều kiện 123 ở Sheet"VBA" => Làm sao chọn được 1 vùng data từ cột thứ 1 đến cột 13 trong sheet"DATA"
K = K + 1
For J = 1 To Col
dArr(K, J) = sArr(i, Arr(1, J))
Next J
End If
Next i
End With
Sheets("VBA").Range("A3").Resize(1000, Col).ClearContents
If K Then Sheets("VBA").Range("A3").Resize(K, Col) = dArr
Set DK = Nothing
End Sub
Mình đọc kỹ lại xem...giải thích
Anh có thể chỉ rõ giúp em vấn đề đang nằm ở đâu. Theo em hiểu ý anh kêu em nhập "=<> " ở phần nàyMình đọc kỹ lại xem...
"cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<>(bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào này. "
If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
Chắc là nói về cái mà tôi dùng trong bài #14 - thủ thuật "bỏ điều kiện"Anh có thể chỉ rõ giúp em vấn đề đang nằm ở đâu. Theo em hiểu ý anh kêu em nhập "=<> " ở phần này
Em cám ơnMã:If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
Dạ em đang cần hỗ trợ ở topic nàyChắc là nói về cái mà tôi dùng trong bài #14 - thủ thuật "bỏ điều kiện"
https://www.giaiphapexcel.com/diendan/threads/tìm-kiếm-dữ-liệu-theo-nhiều-điều-kiện-trong-một-khoảng-thời-gian.134770/post-856407
Nhưng nhìn kỹ lại thì không đúng
Cái của tôi là "<>="
Set DK = Sheets("VBA").Range("O2:O14") 'vùng điều kiện
------------------
----------------
For i = 1 To r
If .Exists(UCase(sArr(i, 4))) Then 'vùng data để lọc
-----------------
------------------
End With
Nhập gì chứ, mình đã nêu được yêu cầu đâu mà nhập nhập.nhập "=<> " ở phần này
Ý gì đâu, nghĩa ở mặt chữ.
Chắc em chưa diễn giải 1 cách dễ hiểu nhất, em cũng tự mò và có cách làm cho điều mình cầnNhập gì chứ, mình đã nêu được yêu cầu đâu mà nhập nhập.
Ý gì đâu, nghĩa ở mặt chữ.
(1) "cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua)"
Mình đang muốn nhập điều kiện vào 13 ô: O2:O14 (sheet VBA) đó sao?
Vậy:
- Nhập đủ 13 điều kiện vào 13 ô đó rồi mới lọc?
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó.
(2) "điều kiện =<> (bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào."
Với mỗi tiêu chí cần xét nhập vào 13 ô O2:O14 thì điều kiện xét /đối chiếu dữ liệu đã cho với các tiêu chí đó như nào?
- Mấy cột là chuỗi (Mã, tên sản phẩm, đơn vị, tên TT....) đối chiếu với tiêu chí nhập vào (O2:O14) thì xét lấy giống, gần giống, hay khác?
- Mấy cột là số (số lượng, giá trị) đối chiếu với tiêu chí nhập vào thì xét lấy bằng, lớn hơn, bé hơn?
--------------------
Phải dí như thế không biết hiểu không?
Sau 14 bài không biết chủ đề đã bắt đầu khởi động được chưa? Hay vẫn oằn tà là vằn....
Cỡ vài tháng mới thấy được một bài mà chủ thớt đăng bài đầy đủ yêu cầu, vào đề luôn, và từ bài #2 là bài giải luôn.
Muốn xét hơn 1 điều kiện (đk) thì dùng thêm vòng lặp xét điều kiện thôi.Dạ em đang cần hỗ trợ ở topic này
về phần code
thì nó đang lọc cột 4 của sheet"DATA" với điều kiện 123 ở Sheet"VBA" => Làm sao chọn được 1 vùng data từ cột thứ 1 đến cột thứ 13 trong sheet"DATA" thay cho số 4 trong code nó chỉ lọc 1 cột duy nhấtMã:Set DK = Sheets("VBA").Range("O2:O14") 'vùng điều kiện ------------------ ---------------- For i = 1 To r If .Exists(UCase(sArr(i, 4))) Then 'vùng data để lọc ----------------- ------------------ End With
Em cám ơn
Sub LocTest()
Dim lastRow As Long, count As Long, r As Long, c As Long, good As Boolean
Dim sArr(), dk(), result(), key, dic As Object
' xoa ket qua cu
Application.EnableEvents = False
Sheets("VBA").Range("A3").Resize(10000, 13).ClearContents
Application.EnableEvents = True
With Sheets("DATA")
lastRow = .Cells(Rows.count, "A").End(xlUp).Row
' khong co du lieu thi ket thuc
If lastRow < 3 Then Exit Sub
sArr = .Range("A3:M" & lastRow).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
dk = Sheets("VBA").Range("O2:O14").Value
For r = 1 To UBound(dk)
If Not IsEmpty(dk(r, 1)) Then dic.Add r, LCase(dk(r, 1)) ' dieu kien dk(r, 1) cho cot r
Next r
If dic.count = 0 Then
' khong co dieu kien, vay coi nhu cac dieu kien deu thoa
Sheets("VBA").Range("A3").Resize(UBound(sArr), UBound(sArr, 2)).Value = sArr
Exit Sub
End If
ReDim result(1 To UBound(sArr), 1 To UBound(sArr, 2))
For r = 1 To UBound(sArr)
good = True
For Each key In dic.keys
If LCase(sArr(r, key)) <> dic.Item(key) Then
' it nhat 1 dk khong thoa vay khong xet tiep dk sau
good = False
Exit For
End If
Next key
If good Then
' neu tat ca cac dk thoa thi lay dong hien hanh
count = count + 1
For c = 1 To UBound(sArr, 2)
result(count, c) = sArr(r, c)
Next c
End If
Next r
If count Then
' neu co ket qua thi nhap xuong sheet
Application.EnableEvents = False
Sheets("VBA").Range("A3").Resize(count, UBound(result, 2)).Value = result
Application.EnableEvents = True
End If
Set dic = Nothing
End Sub
Đến bài này, nhưng bạn giải thích cũng chưa rõ ràng, và chưa có ví dụ cụ thể.Chắc em chưa diễn giải 1 cách dễ hiểu nhất, em cũng tự mò và có cách làm cho điều mình cần
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó. => Riêng phần này đúng là em cần nhưng chưa giải quyết được.