Lọc dữ liệu trong 3 cột

Liên hệ QC

adult

Thành viên hoạt động
Tham gia
2/12/07
Bài viết
193
Được thích
30
Chào các bạn,
Mình có 1 file muốn khi chọn ngày ở ô E1 thì lệnh sẽ tìm ngày trong 3 cột E,F,G sau đó sẽ copy dữ liệu đó sang sheet mới hoặc bằng chính sheet đó cũng được.
Các bạn có thể xem file ví dụ để hiểu rõ hơn. Xin lỗi vì có thể mình diễn đạt không được tốt.
Công ty chặn upload file nên mình up lên google drive nhé https://drive.google.com/file/d/0BySAiYHOcNkLdDZzU3hBd2xjc2s/view?usp=sharing
Cảm ơn trước vì các bạn hỗ trợ
 
Thử code này sẽ ra
Mã:
Sub TN()
Dim Arr(5 To 100, 10 To 100)
[a1] = LBound(Arr)
[b1] = UBound(Arr)
[c1] = LBound(Arr, 2)
[d1] = UBound(Arr, 2)
End Sub
Khi anh viết bài này thì em hiểu là hai anh em mình có cách sử dụng từ ngữ khác nhau thôi. Nhưng thường em thấy hay ghi ubound là trên hơn,
Ví dụ như link này chẳng hạn
http://www.giaiphapexcel.com/forum/showthread.php?22361-Lbound-và-UBound-là-gì
 
Lần chỉnh sửa cuối:
Upvote 0
Khi anh viết bài này thì em hiểu là hai anh em mình có cách sử dụng từ ngữ khác nhau thôi. Nhưng thường em thấy hay ghi ubound là trên hơn,

Có lẽ vậy, khi viết thường chỉ coi nếu step=1 là thuận, =-1 là nghịch cho dễ suy nghĩ, nên cũng không câu nệ lắm.
 
Upvote 0
Chỉ biết tàm tạm thế này
- Value2 tương tự như Value nhưng nghe nói là tốc độ nhanh hơn
- Ubound là cận dưới của mảng, Lbound là cận trên
Đoạn này chắc viết nhanh nên hơi lộn tý anh nhỉ
Value2 khi áp vào mảng dữ liệu lớn tốc độ nhanh hơn value anh ah
- Value khi chuyển vào array sẽ giữ nguyên định dạng của dữ liệu còn value2 sẽ tự động chuyển dữ liệu về dạng general.
Ví dụ: ô kiểu date chứa 1/1/2015 khi dùng value sẽ giữ nguyên như vậy (trong VBA dùng Isdate() sẽ ra TRUE) còn value2 sẽ thành 42005 (ISDATE()=FALSE), đây có thể là điểm lợi của Value; ô kiểu Currency khi dùng value sẽ tự động cắt bớt phần thập phân chỉ giữ lại 4 chữ số thập phân sau dấu phẩy (Ví dụ 1.123456789 định dạng Currency thì value sẽ được 1.1235, value2 giữ nguyên), đây là lợi thế của value2.
Tốc độ thì value2 nhanh hơn value.
- Ubound là cận trên (Upper), Lbound là cận dưới (Lower)
 
Upvote 0
- Value khi chuyển vào array sẽ giữ nguyên định dạng của dữ liệu còn value2 sẽ tự động chuyển dữ liệu về dạng general.
Ví dụ: ô kiểu date chứa 1/1/2015 khi dùng value sẽ giữ nguyên như vậy (trong VBA dùng Isdate() sẽ ra TRUE) còn value2 sẽ thành 42005 (ISDATE()=FALSE), đây có thể là điểm lợi của Value; ô kiểu Currency khi dùng value sẽ tự động cắt bớt phần thập phân chỉ giữ lại 4 chữ số thập phân sau dấu phẩy (Ví dụ 1.123456789 định dạng Currency thì value sẽ được 1.1235, value2 giữ nguyên), đây là lợi thế của value2.
Tốc độ thì value2 nhanh hơn value.
- Ubound là cận trên (Upper), Lbound là cận dưới (Lower)
Phải nói là anh rất "chắc" về VBA. Tôi thì thường dùng value.
 
Upvote 0
Chỉ biết tàm tạm thế này
- Value2 tương tự như Value nhưng nghe nói là tốc độ nhanh hơn
- Ubound là cận dưới của mảng, Lbound là cận trên

-----

Thêm và sửa mấy dòng điều kiện
Mã:
Public Sub Ngay()
Dim I, K, Arr(), Darr(), Dt, Ds, c As Long

With Sheet1
Dt = .Cells(1, 5).Value: Ds = .Cells(1, 6).Value
Arr = .Range(.[A6], .[A6].End(xlDown)).Resize(, 7).Value2
End With
ReDim Darr(1 To UBound(Arr, 1), 1 To 7)

For I = 1 To UBound(Arr, 1)
If Arr(I, 5) >= Dt Or Arr(I, 6) >= Dt Or Arr(I, 7) >= Dt Then
If Arr(I, 5) <= Ds Or Arr(I, 6) <= Ds Or Arr(I, 7) <= Ds Then
K = K + 1
Darr(K, 1) = K
For c = 2 To UBound(Arr, 2)
Darr(K, c) = Arr(I, c)
Next c
End If
End If
Next

If K <> 0 Then
With Sheet2
.Range("A6:G5000").ClearContents
.Range("A6").Resize(K, 7).Value = Darr
.Range("E6").Resize(K, 3).NumberFormat = "dd/mm/yyyy"
End With
Else
MsgBox "Ngay Nay Khong Ton Tai"
End If

End Sub
Bạn ơi, sao mình gõ ngày nó cứ báo ngày không tồn tại trong khi ngày đó có trong dữ liệu.
Lỗi do mình chưa đánh hết số thứ tự, nhưng khi mình đánh đầy đủ rồi chọn ngày 12/03/2015 ở ô E1 và ngày 16/03/2015 ở ô E2 thì dữ liệu nó ra 02/10/2014 chứ không nằm trong khu ngày mình chọn. Bạn xem và sửa lại giúp mình với nhé. Cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi, sao mình gõ ngày nó cứ báo ngày không tồn tại trong khi ngày đó có trong dữ liệu.
Lỗi do mình chưa đánh hết số thứ tự, nhưng khi mình đánh đầy đủ rồi chọn ngày 12/03/2015 ở ô E1 và ngày 16/03/2015 ở ô E2 thì dữ liệu nó ra 02/10/2014 chứ không nằm trong khu ngày mình chọn. Bạn xem và sửa lại giúp mình với nhé. Cảm ơn

Xem thử file này coi sao
 

File đính kèm

  • Vidu2.rar
    32.8 KB · Đọc: 36
Upvote 0
Bạn ơi, sao mình gõ ngày nó cứ báo ngày không tồn tại trong khi ngày đó có trong dữ liệu.
Lỗi do mình chưa đánh hết số thứ tự, nhưng khi mình đánh đầy đủ rồi chọn ngày 12/03/2015 ở ô E1 và ngày 16/03/2015 ở ô E2 thì dữ liệu nó ra 02/10/2014 chứ không nằm trong khu ngày mình chọn. Bạn xem và sửa lại giúp mình với nhé. Cảm ơn

Thêm một vòng lặp cho lành
code trong module
Mã:
Public Sub Ngay()
Dim I, K, Arr(), Darr(), Dt, Ds, c As Long, cl As Long

With Sheet1
Dt = CDate(.Cells(1, 5).Value): Ds = CDate(.Cells(1, 6).Value)
Arr = .Range(.[A6], .[A6].End(xlDown)).Resize(, 7).Value2
End With
ReDim Darr(1 To UBound(Arr, 1), 1 To 7)

For cl = 5 To 7
For I = 1 To UBound(Arr, 1)
If Arr(I, cl) >= Dt And Arr(I, cl) <= Ds And Arr(I, cl) <> "x" And Arr(I, cl) <> "" Then
K = K + 1
Darr(K, 1) = K
For c = 2 To UBound(Arr, 2)
Darr(K, c) = Arr(I, c)
Next c
End If
Next
Next

If K <> 0 Then
With Sheet2
.Range("A6:G5000").ClearContents
.Range("A6").Resize(K, 7).Value = Darr
.Range("E6").Resize(K, 3).NumberFormat = "dd/mm/yyyy"
End With
Else
MsgBox "Ngay Nay Khong Ton Tai"
End If

End Sub
code trong sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$1" Or Target.Address = "$F$1" Then Ngay
End Sub

Thứ tự nhập ngày tháng trong [E1] và [F1] phải phù hợp với dữ liệu của các cột "ngày..."
 

File đính kèm

  • LocTheoNgay.xlsm
    50.1 KB · Đọc: 21
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn đã hỗ trợ, file chạy cũng rất ổn, cho mình hỏi trong code của bạn mình xem qua thì không thấy chỗ nào nói đến tìm ở cột 5,6,7 mà sao nó vẫn hiểu. Bạn có thể chia sẻ thêm được không, để mình có thể áp dụng trong trường hợp khác luôn?
 
Upvote 0
Thêm một vòng lặp cho lành
code trong module
Mã:
Public Sub Ngay()
Dim I, K, Arr(), Darr(), Dt, Ds, c As Long, cl As Long

With Sheet1
Dt = CDate(.Cells(1, 5).Value): Ds = CDate(.Cells(1, 6).Value)
Arr = .Range(.[A6], .[A6].End(xlDown)).Resize(, 7).Value2
End With
ReDim Darr(1 To UBound(Arr, 1), 1 To 7)

For cl = 5 To 7
For I = 1 To UBound(Arr, 1)
If Arr(I, cl) >= Dt And Arr(I, cl) <= Ds And Arr(I, cl) <> "x" And Arr(I, cl) <> "" Then
K = K + 1
Darr(K, 1) = K
For c = 2 To UBound(Arr, 2)
Darr(K, c) = Arr(I, c)
Next c
End If
Next
Next

If K <> 0 Then
With Sheet2
.Range("A6:G5000").ClearContents
.Range("A6").Resize(K, 7).Value = Darr
.Range("E6").Resize(K, 3).NumberFormat = "dd/mm/yyyy"
End With
Else
MsgBox "Ngay Nay Khong Ton Tai"
End If

End Sub
code trong sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$1" Or Target.Address = "$F$1" Then Ngay
End Sub

Thứ tự nhập ngày tháng trong [E1] và [F1] phải phù hợp với dữ liệu của các cột "ngày..."
Bạn ơi, mình xem trong file của bạn làm có thêm 3 cột phụ I,J,K, nếu xóa đi có hoạt động không? Và khi mình nhập ngày 01/10/2014 vô ô E1 thì code báo lỗi.
Bạn xem và kiểm tra lại giúp mình nhé.

Thấy các bạn hỗ trợ mình nhiệt tình nhưng mình lại phản hồi hơi trễ mong các bạn thông cảm vì tính chất công việc mình phải chạy tới lui ra ngoài liên tục.
 
Upvote 0
Mình ngâm được sơ sơ cái code của bạn và hiểu được ngày mà bạn đem so sánh là chỉ tính từ cột thứ 5 trở về sau. Và cũng đã áp dụng được trong file khác rồi. Nhưng mình thấy code của bạn bị chậm nhiều so với code của các bạn ở trên làm. Không biết có cách nào để tăng tốc nó hơn không?
Cảm ơn các bạn nhiều
 
Upvote 0
Mình ngâm được sơ sơ cái code của bạn và hiểu được ngày mà bạn đem so sánh là chỉ tính từ cột thứ 5 trở về sau. Và cũng đã áp dụng được trong file khác rồi. Nhưng mình thấy code của bạn bị chậm nhiều so với code của các bạn ở trên làm. Không biết có cách nào để tăng tốc nó hơn không?
Cảm ơn các bạn nhiều

Khoái cái nào thì xài cái đó, mỗi người có cách viết riêng mà. Cũng như 1 bài toán có nhiều cách giải, vậy thôi.
 
Upvote 0
Khoái cái nào thì xài cái đó, mỗi người có cách viết riêng mà. Cũng như 1 bài toán có nhiều cách giải, vậy thôi.
Code của bạn có 1 cái hạn chế là, nếu sau cột 5,6,7 mà có dữ liệu thêm rồi đến cột 9 là ngày nữa thì code không tìm được cột 9. Còn code của bạn kia mình áp dụng vô file toàn báo lỗi nên không dùng được, hơi tiếc.
 
Upvote 0
Code của bạn có 1 cái hạn chế là, nếu sau cột 5,6,7 mà có dữ liệu thêm rồi đến cột 9 là ngày nữa thì code không tìm được cột 9. Còn code của bạn kia mình áp dụng vô file toàn báo lỗi nên không dùng được, hơi tiếc.

Nói chung là dữ liệu thế nào, yêu cầu thế nào, thì viết code như thế đó, những cái nếu "trong tương lai" thì không ai viết code dự trù được các tình huống này.
..............Chạy bỏ luôn dép còn sướng hơn. adult.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói chung là dữ liệu thế nào, yêu cầu thế nào, thì viết code như thế đó, những cái nếu "trong tương lai" thì không ai viết code dự trù được các tình huống này.
..............Chạy bỏ luôn dép còn sướng hơn. adult.
Hì, mình chỉ nhận xét thêm thôi chứ các bạn đã giúp mình đúng ý là được rồi. Cảm ơn các bạn lần nữa nhé
 
Upvote 0
Web KT
Back
Top Bottom