Lọc nhiều điều kiện bằng mảng

Liên hệ QC

Phương Phương mito

Thành viên thường trực
Tham gia
1/5/19
Bài viết
275
Được thích
65
Kính gửi ANh Chị và các bạn
Chẳng hạn khi em làm việc lọc dữ liệu với nhiều điều kiện bằng Mảng em có đoạn sau

Arr(i,5) = "hanoi" and Arr(i,5) = "haiphong" and Arr(i,5) = "dalat" and Arr(i,5) = "khanhhoa" and Arr(i,5) = "binhdinh" and Arr(i,5) = "daclac"....khoảng 64 tỉnh chẳng hạn. Có cách gì viết khác để khỏi lặp lại và nó vẫn hiểu không ạ. Cách viết kiểu Array("Hanoi","Khạnhhoa".....) có được không ạ và viết kiểu gì chỗ này ạ. Em cảm ơn ạ.
 
Kính gửi ANh Chị và các bạn
Chẳng hạn khi em làm việc lọc dữ liệu với nhiều điều kiện bằng Mảng em có đoạn sau

Arr(i,5) = "hanoi" and Arr(i,5) = "haiphong" and Arr(i,5) = "dalat" and Arr(i,5) = "khanhhoa" and Arr(i,5) = "binhdinh" and Arr(i,5) = "daclac"....khoảng 64 tỉnh chẳng hạn. Có cách gì viết khác để khỏi lặp lại và nó vẫn hiểu không ạ. Cách viết kiểu Array("Hanoi","Khạnhhoa".....) có được không ạ và viết kiểu gì chỗ này ạ. Em cảm ơn ạ.
Nhìn thấy AND là biết kết quả.
 
Upvote 0
Là sao anh ơi, em chưa hiểu ý anh. Mong anh chỉ giáo. Em định đưa 64 tỉnh vào một cột trong một sheet nào đó để duyệt nhưng chưa nghĩ ra cách ạ.
Làm sao Arr(i, 5) vừa = "hanoi", vừa = "haiphong", vừa bằng ...?
OR thì còn hiểu được.
Nếu đưa vào mảng thì cũng là OR (nếu có trong mảng thì TRUE, không thì FALSE)
Tốt nhất là dữ file dữ liệu lên và nói rõ yêu cầu bạn muốn có.
 
Upvote 0
Làm sao Arr(i, 5) vừa = "hanoi", vừa = "haiphong", vừa bằng ...?
OR thì còn hiểu được.
Nếu đưa vào mảng thì cũng là OR (nếu có trong mảng thì TRUE, không thì FALSE)
Dạ vâng ạ. Trong mảng của em tại cột 5 tên tỉnh và thành phố. Giờ em chỉ muốn lọc các dòng của 64 tỉnh thôi ạ.
Bài đã được tự động gộp:

Làm sao Arr(i, 5) vừa = "hanoi", vừa = "haiphong", vừa bằng ...?
OR thì còn hiểu được.
Nếu đưa vào mảng thì cũng là OR (nếu có trong mảng thì TRUE, không thì FALSE)
Tốt nhất là dữ file dữ liệu lên và nói rõ yêu cầu bạn muốn có.
Chẳng hạn code như này ạ


Mã:
Sub LocDL()
Dim Data(), i&, KQ(), k&
Data = Range(Sheet1.[A2], Sheet1.[A5000].End(3)).Resize(, 3)
ReDim KQ(1 To UBound(Data), 1 To 3)
For i = 1 To UBound(Data)
    If Data(i, 5) ="hanoi" or Data(i, 5) ="hanam" or Data(i, 5) ="thaibinh"....  Then
        k = k + 1
        KQ(k, 1) = Data(i, 1)
        KQ(k, 2) = Data(i, 2)
        KQ(k, 3) = Data(i, 3)
    End If
Next
Sheet2.[J6:L5000].ClearContents
Sheet2.[J6].Resize(k, 3) = KQ
end sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lọc kiểu này dùng Advanced Filter cho lẹ. Mảng chi cho mệt bạn
 
Upvote 0
Lọc kiểu này dùng Advanced Filter cho lẹ. Mảng chi cho mệt bạn
Em thích dùng mảng ạ.
Em đang làm theo hướng cho danh sách 64 tỉnh thành một cột và cho nó vào mảng. Nhưng vẫn không được ạ.

MA = ThisWorkbook.Sheets("Tinh").Range("A1:A64").Value
For i = 1 To UBound(Data)
For j = 1 to UBound(MA)
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
End If
Next
Next

Lọc kiểu này dùng Advanced Filter cho lẹ. Mảng chi cho mệt bạn
 
Upvote 0
Em thích dùng mảng ạ.
Em đang làm theo hướng cho danh sách 64 tỉnh thành một cột và cho nó vào mảng. Nhưng vẫn không được ạ.

MA = ThisWorkbook.Sheets("Tinh").Range("A1:A64").Value
For i = 1 To UBound(Data)
For j = 1 to UBound(MA)
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
End If
Next
Next
Bạn phân tích logic xem, nhìn thấy không ổn rồi.
Đã mất công cho vô điều kiện lọc vô mảng mà ko dùng Advanced filter thì hơi phí.
 
Upvote 0
Em thích dùng mảng ạ.
Em đang làm theo hướng cho danh sách 64 tỉnh thành một cột và cho nó vào mảng. Nhưng vẫn không được ạ.

MA = ThisWorkbook.Sheets("Tinh").Range("A1:A64").Value
For i = 1 To UBound(Data)
For j = 1 to UBound(MA)
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
End If
Next
Next
Nhanh nhất bạn cho ít dữ liệu giả định và kết quả mong muốn lên là có phương án tối ưu ngay.
 
Upvote 0
Em thích dùng mảng ạ.
Em đang làm theo hướng cho danh sách 64 tỉnh thành một cột và cho nó vào mảng. Nhưng vẫn không được ạ.

MA = ThisWorkbook.Sheets("Tinh").Range("A1:A64").Value
For i = 1 To UBound(Data)
For j = 1 to UBound(MA)
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
End If
Next
Next
Đúng được 99% rồi đó, thêm "exit for" vào dưới KQ(k, 3) = Data(i, 3) là sẽ mượt mà.
 
Upvote 0
Em thích dùng mảng ạ.
Em đang làm theo hướng cho danh sách 64 tỉnh thành một cột và cho nó vào mảng. Nhưng vẫn không được ạ.

MA = ThisWorkbook.Sheets("Tinh").Range("A1:A64").Value
For i = 1 To UBound(Data)
For j = 1 to UBound(MA)
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
End If
Next
Next
Hihi, cái này cũng vui, nếu bạn cho 64 Tỉnh thành vào mảng, chạy 2 vòng FOR lồng thì khi "If Data(i, 5) = Ma(j,1) Then" thằng này thoả thì gán dữ liệu vào mảng KQ, nhưng gán xong phải thoát vòng FOR J đi chứ, nếu không nó chạy hết 64 Tỉnh thành dù không còn trùng nữa
Còn nếu không cương quyết làm như vậy, bài này có thể làm theo cách khác cũng được
1) Set thằng MA thành RANGE, chạy 1 vòng FOR I, dùng COUNTIF, thằng nào thoả thì gán dữ liệu vào mảng KQ
2) Gom 64 em Tỉnh thành vô một cục, chạy 1 vòng FOR I, dùng INSTR kiểm tra, thằng nào thoả thì gán dữ liệu vào mảng KQ
Hết
 
Upvote 0
Hihi, cái này cũng vui, nếu bạn cho 64 Tỉnh thành vào mảng, chạy 2 vòng FOR lồng thì khi "If Data(i, 5) = Ma(j,1) Then" thằng này thoả thì gán dữ liệu vào mảng KQ, nhưng gán xong phải thoát vòng FOR J đi chứ, nếu không nó chạy hết 64 Tỉnh thành dù không còn trùng nữa
Còn nếu không cương quyết làm như vậy, bài này có thể làm theo cách khác cũng được
1) Set thằng MA thành RANGE, chạy 1 vòng FOR I, dùng COUNTIF, thằng nào thoả thì gán dữ liệu vào mảng KQ
2) Gom 64 em Tỉnh thành vô một cục, chạy 1 vòng FOR I, dùng INSTR kiểm tra, thằng nào thoả thì gán dữ liệu vào mảng KQ
Hết
Nhiều khi phức tạp tình hình bác Cò nhỉ. Một tool tuyệt vời của excel là advanced filter chạy phè phè, còn cơ động nữa chứ, thích bổ sung điều kiện, thích thay đổi trường kết quả một phát ăn liền. Chứ mà có 20 trường xong đảo vị trí lung tung phèng lên thì rối tung cả code.
 
Upvote 0
Hihi, cái này cũng vui, nếu bạn cho 64 Tỉnh thành vào mảng, chạy 2 vòng FOR lồng thì khi "If Data(i, 5) = Ma(j,1) Then" thằng này thoả thì gán dữ liệu vào mảng KQ, nhưng gán xong phải thoát vòng FOR J đi chứ, nếu không nó chạy hết 64 Tỉnh thành dù không còn trùng nữa
Còn nếu không cương quyết làm như vậy, bài này có thể làm theo cách khác cũng được
1) Set thằng MA thành RANGE, chạy 1 vòng FOR I, dùng COUNTIF, thằng nào thoả thì gán dữ liệu vào mảng KQ
2) Gom 64 em Tỉnh thành vô một cục, chạy 1 vòng FOR I, dùng INSTR kiểm tra, thằng nào thoả thì gán dữ liệu vào mảng KQ
Hết
Mong anh hướng dẫn cách 1 ạ. Thoát vòng lặp như nào ạ, em đã next 2 lần rùi ạ. Không hiểu code em sai chỗ nào ạ. Em toàn học mót lên bản chất nhiều khi chưa hiểu hết ạ.
 
Upvote 0
Mong anh hướng dẫn cách 1 ạ. Thoát vòng lặp như nào ạ, em đã next 2 lần rùi ạ. Không hiểu code em sai chỗ nào ạ. Em toàn học mót lên bản chất nhiều khi chưa hiểu hết ạ.
Bạn đưa file lên đi. Bác Cò chạy rẹt cái xong. Nếu bạn thích thêm AF thì tôi cũng có thể code được.
 
Upvote 0
Phải chăng file có gì đó rất bí mật cho nên đến bài #17 rồi mà vẫn chưa đưa file giả định lên được nhỉ? trong khi code thì đưa được. Bạn đã là thành viên thường trực cơ mà, chắc là cũng thừa hiểu được người muốn giúp bạn cần gì chứ?
 
Upvote 0
Mong anh hướng dẫn cách 1 ạ. Thoát vòng lặp như nào ạ, em đã next 2 lần rùi ạ. Không hiểu code em sai chỗ nào ạ. Em toàn học mót lên bản chất nhiều khi chưa hiểu hết ạ.
Code của bạn không sai, chỉ có cái là nó cứ nghe lời bạn luôn luôn chạy đủ 1 vòng 64 tỉnh thành dù có thoả hay không thoả điều kiện
Trường hợp thoả, tức là tìm được 1 tỉnh thành hợp lệ khi gán kết quả xong thì thoát vòng lặp, vì có chạy nữa cũng đâu tìm ra em thứ 2 thoả điều kiện.
Cách thoát vòng J
If Data(i, 5) = Ma(j,1) Then
k = k + 1
KQ(k, 1) = Data(i, 1)
KQ(k, 2) = Data(i, 2)
KQ(k, 3) = Data(i, 3)
Exit For
End If
 
Upvote 0
Web KT
Back
Top Bottom