Lọc mảng nhiều điều kiện
Mình có bảng dữ liệu sau:
18091Giờ mình muốn tạo 1 sheet khác, lọc riêng Mã hàng, Tên hàng, Số lượng theo điều kiện của Ngày và NCC, ví dụ như:
18090
Khi thay đổi điều kiện ở ô B1 và B2 thì sẽ các giá trị từ dòng 4 sẽ cập nhật theo.
Các cụ có phương án nào hay tư vấn giúp em.
Xài 1 cột phụ (cột F tại sheet Tổng hợp nhé! (Công thức thì file đính kèm.)
Còn code thì thử cái này:
Sub Loc()
Dim Sh As Worksheet, Arr(), zArr()
Dim Rws As Long, J&, W&, dk1 As Date, dk2 As String
dk1 = Sheets("CHI TIET").[B1].Value
dk2 = Sheets("CHI TIET").[B2].Value
zArr = Array(2, 3, 5)
Set Sh = Sheets("TONG HOP")
With Sh.[A2]
Rws = .CurrentRegion.Rows.Count
Arr() = .Resize(Rws, 5).Value
End With
ReDim dArr(1 To Rws, 1 To 3)
For J = 1 To UBound(Arr())
If Arr(J, 1) = dk1 And Arr(J, 4) = dk2 Then
W = 1 + W
For Z = 0 To UBound(zArr)
dArr(W, Z + 1) = Arr(J, zArr(Z))
Next Z
End If
Next J
If W Then
Sheets("CHI TIET").[A4].Resize(65000, 3).ClearContents
Sheets("CHI TIET").[A4].Resize(W, 3).Value = dArr()
End If
End Sub
Code trên chưa có ổn. Lẽ ra thì khi để trống không chọn ngày đặt hàng, chọn mỗi NCC thì ở bên dưới phải sổ tất cả dữ liệu mà mình đặt hàng của NCC đó.
Thử làm theo hướng bác bảo
+ Nếu cả 2 điều kiện không trống thì dò theo 2 điều kiện
+ Nếu một trong 2 trống,thì chỉ dò theo cái điều kiện Không trống
Mà cứ lẫn quẫn trong vùng If, Elseif,……….If hoài. Được cái này thì cái kia không chạy, hoặc ngược lại.Hix hixx……&&&%$R&&&%$R&&&%$R&&&%$R
Bác code mẫu đoạn này cho tôi học hỏi với, lẫn quẫn quá.
Xem thử file này coi sao:18090
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Bạn copy CT này vào ô D4 sau đó kéo sang, xuống cho các ô còn lại nhé:
=IFERROR(OFFSET('TONG HOP'!$A$1,SMALL(IF('TONG HOP'!$A$2:$A$9='CHI TIET'!$B$1,IF('TONG HOP'!$D$2:$D$9='CHI TIET'!$B$2,MATCH('TONG HOP'!$B$2:$B$9,'TONG HOP'!$B$2:$B$9,0),"")),ROW(1:1)),MATCH(A$3,'TONG HOP'!$A$1:$E$1,0)-1),"")
Bạn kết thúc bằng CTRL+SHIFT+ENTER
Hix. cảm ơn bác. Giờ đã hiểu mình sai ngay đoạn ElseIf hixxx………
Trong code của bạn huypham có khai báo Dim Hdk As Date và Hdk=Sheet2..Value2
Theo mình đã khai báo kiểu Date thì nên dùng Value, tuy ở trường hợp này code chạy đúng nhưng bạn không nên lẫn lộn value và value2. Value2 chuyển đổi giá trị Date sang Number nhưng do Hdk có kiểu Date rồi nên Number lại được chuyển về kiểu Date, còn Value sẽ giữ nguyên kiểu Date.
Úi……lọc duy nhất chỗ này mà chế Code phụ thuộc vào điều kiện ngày tại cell B1 chi cho rồi mắt vậy bạn. Sao không làm động tác copy cột D2:D1000 sheet tổng hợp ra sheet khác (hình như là sheet5 bạn mới thêm). Sau đó dùng RemoveDuplicates cho khỏe…
(đằng nào cũng phải lấy hết danh sách các nhà cung cấp, nên cứ làm vầy cho khỏe, khỏi phải nghĩ suy.)
Chỉ đơn giản là: (
Còn Source của Data valation (cell B2 sheet chi tiết). thì bạn đặt cho vùng A2:A1000 của sheet mới vừa thêm (sheet5) này một cái name động là được, có bao nhiêu mã NCC thì nó tự lấy rồi
Name động làm list cho Source:
Sheet1!$A$2: màu đỏ này bạn chỉnh cho đúng tên sheet thực tế mới thêm của bạn
đã dùng code mà còn bị tốn 1 vùng trên sheet để lưu danh sách (tấc đất tấc vàng), rồi tốn thêm 1 named để đặt tên cho cái vùng đó nữa => chưa đi đến bến bờ ăn chơi )(&&@@)(&&@@)(&&@@
có cách nào thực hiện bằng code đúng như hình vẽ #10 không ta ? List Source hiện lên chính xác
NCC1,NCC2,NCC3
Mới thử Record,
Vấn đề là có được cái vùng đỏ đỏ ấy là tôi nghỉ có thể được………..
1. Copy dữ liệu gốc
2. Dán vào vùng tạm
3. Remove Dup
4. Nối lại như mãng trên
5. Đưa vào source như record ở trên
6. Xóa vùng tạm
Kết thúc sub
Ý tưởng là vậy, ai làm để học hỏi đi……….hihihi
Em cũng làm theo hướng của anh luôn rồi. Nhưng cố đợi anh chàng cao siêu đó hỏi "đểu" nữa. "Người ấy" không phải dạng vừa. Hình như đoạn trên đấy không cần anh nhỉ? Chỉ vô Source mới thấy. Bên ngoài thì đâu ảnh hưởng )(&&@@
Các bác cao siêu quá, toàn DIC to DIC nhỏ, mình mới học code, nghỉ sao viết vậy.
nhìn phần chữ kí của anh chắc là anh ít xài Dic nên mới nghĩ và làm thế . còn anh nhìn chữ kí của em chắc cũng biết em thích tắm cái giếng nào . hihi . đâu cần phải khỗ vậy . nhờ anh và các bạn ở trên giúp đỡ , em mới nghĩ ra được cách này . cám ơn các bạn
cái đó đương nhiên rồi . em đoán là chức năng remove Duplicate của excel cũng hoạt động theo nguyên tắc này .
khi các bạn từng thử nghiệm lấy danh sách duy nhất với cỡ khoảng hàng trăm nghìn mã số khác nhau thì có lẽ các bạn sẽ dẹp bỏ được ý nghĩ : lấy danh sách không trùng mà không cần dùng Dic hoặc chức năng remove duplicate
còn anh nữa : bài viết của anh có 4 chữ số rồi sao vẫn các ngôi sao quay đều vậy ? phải bao nhiêu bài viết mới được 1 sao đứng im vậy ?
Thêm 1 cách không xài DIC nè:
Ý BẠN LÀ đưa ngày vào Validation phải ko nếu vậy thì code sau
mình mới đổi lại kiểu With CreateObject("scripting.dictionary")
Public Sub Dic_Validation()
Dim Arr(), i As Long
Arr = Range("A2", .End(3)).Value
With CreateObject("scripting.dictionary")
For i = 1 To UBound(Arr)
.Item(Arr(i, 1)) = ""
'.Item(Arr(i, 1)) = .Count
Next
Range("G2").Validation.Delete
Range("G2").Validation.Add 3, , , Join(.keys, ",")
End With
End Sub
Bạn có thể tham khảo thêm ở link sau
https://www.giaiphapexcel.com/forum/showthread.php?84045-C%C3%A1ch-l%C3%A0m-Kh%C3%B4ng-c%C3%B3-%C3%B4-tr%E1%BB%91ng-trong-Data-Validation-settings-list-Source/page3
https://www.giaiphapexcel.com/forum/showthread.php?84205-H%E1%BB%8Fi-v%E1%BB%81-Data-Validation/page3
Tặng cho thớt này một kiểu nữa nè tha hồ mà lựa….Tui nhớ trước đây có thành viên dị ứng với Dic To Dic Thon keo tui ko biết Dic giờ tui viết các kiểu cho mà coi.. nha–=0–=0–=0
Public Sub Date_Validation()
Dim dl(), i As Long
dl = Range(, .End(3)).Value
With CreateObject("scripting.dictionary")
For i = 1 To UBound(dl)
If Not .Exists(dl(i, 1)) Then .Item(dl(i, 1)) = .Count
Next
.Validation.Delete
.Validation.Add 3, , , Join(.keys, ",")
End With
End Sub
Oh.
1. Trường hợp đầu khi Dim Dic As Object, rồi Set Dic = ….. : như vậy nó làm cho dữ liệu ngày thành Value
2. Trường hợp code ở Quote bên trên: With CreateObject("scripting.dictionary"). Mà không cần Dim hay Set thì định dạng ngày nó lại không thay đổi.
Lý do tại sao như vậy nhỉ? Mong bác giải thích giúp!-0-/.
Oh. Mới test lại code DIC, đúng thật là nó ra dạng ngày luôn. không hiểu sao hồi lúc test nó lại ra value mới ghê.hixhix……..
Nếu không dùng DIC (mấy code không phải DIC ở topic này) nếu áp dụng ngày thì có để nguyên định dạng đưa vào Validation không anh? nếu được anh làm thử cho cái tham khảo nha!
Không sử dụng DIC
Quan trọng là cái chỗ mình đặt nó đang định dạng là kiểu gì thôi mà?