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ợ
 
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ợ

bài này bạn ko cần phải lập trình mà sử dụng chức năng có sẵn của Excel:
- chọn vùng cần lọc
- menu Data - chọn Filter
- lọc các cột cần tìm (hoặc lọc kết hợp nhiều điều kiện)
 
Upvote 0
bài này bạn ko cần phải lập trình mà sử dụng chức năng có sẵn của Excel:
- chọn vùng cần lọc
- menu Data - chọn Filter
- lọc các cột cần tìm (hoặc lọc kết hợp nhiều điều kiện)

Bạn có thể hướng dẫn cách bạn nói không? Nếu lọc bình thường thì chỉ lọc từng cột chứ không thể lọc 1 lúc 3 cột được.
vì mình ví dụ chỉ 2 trường hợp nên chắc bạn chưa thấy cái vướng mắc.
 
Upvote 0
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ợ
Mình đang học viết code nên làm thử đúng không nha
 
Upvote 0
Upvote 0
Bạn đã làm đúng ý mình rồi và File bạn làm lệnh thực thi rất nhanh nhưng nó đã phát sinh lỗi khi mình đổ thử dữ liệu nhiều vô, bạn kiểm tra lại giúp mình xem lỗi này như thế nào nhé.
https://drive.google.com/file/d/0BySAiYHOcNkLVnpwcHdCSFg0Vjg/view?usp=sharing
cảm ơn bạn nhiều
PHP:
Sub Ngay()
Dim Sarr(), Darr(), i As Long, k As Long, TMP
With Sheet1
    TMP = .[E1]
    Sarr = .Range(.[A6], .[A65000].End(xlUp)).Resize(, 7).Value2
End With
ReDim Darr(1 To UBound(Sarr, 1), 1 To 7)
With Sheet2
For i = 1 To UBound(Sarr, 1)
    If Sarr(i, 5) <> "" Or Sarr(i, 6) <> "" Or Sarr(i, 7) <> "" Then
            If Sarr(i, 5) = TMP Or Sarr(i, 6) = TMP Or Sarr(i, 7) = TMP Then
                    k = k + 1
                    Darr(k, 1) = k
                    Darr(k, 2) = Sarr(i, 2)
                    Darr(k, 3) = Sarr(i, 3)
                    Darr(k, 4) = Sarr(i, 4)
                    Darr(k, 5) = Sarr(i, 5)
                    Darr(k, 6) = Sarr(i, 6)
                    Darr(k, 7) = Sarr(i, 7)
            End If
    End If
Next i
    .[A6:G50000].ClearContents
    .[A6].Resize(k, 7).Value = Darr
           
End With
End Sub
Bạn thử lại xem sao
 
Upvote 0
cho mình ý kiến ké 1 tí --=0, lệnh with sheet2 ... end with đặt như vậy là ko cần thiết, có lẽ phải như vậy:

Mã:
With sheet2
    .[A6:G50000].ClearContents
    .[A6].Resize(k, 7).Value = Darr
End With
Diễn đàn mà, có gì bạn cứ góp ý thẳng thắn , sai thì sửa thôi. thực ra mình nghĩ nó là cách viết thôi
 
Upvote 0
Bạn đã làm đúng ý mình rồi và File bạn làm lệnh thực thi rất nhanh nhưng nó đã phát sinh lỗi khi mình đổ thử dữ liệu nhiều vô, bạn kiểm tra lại giúp mình xem lỗi này như thế nào nhé.
https://drive.google.com/file/d/0BySAiYHOcNkLVnpwcHdCSFg0Vjg/view?usp=sharing
cảm ơn bạn nhiều
Theo code của lhthai

Cột "A" của sheet1 phải điền đầy đủ số thứ tự
Bổ sung thêm lệnh kiểm tra biến "K<>0"

Mã:
Public Sub Ngay()
Dim I, K, Arr(), Darr(), D

With Sheet1
D = .Cells(1, 5).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) = D Or Arr(I, 6) = D Or Arr(I, 7) = D Then
K = K + 1
Darr(K, 1) = K
Darr(K, 2) = Arr(I, 2)
Darr(K, 3) = Arr(I, 3)
Darr(K, 4) = Arr(I, 4)
Darr(K, 5) = Arr(I, 5)
Darr(K, 6) = Arr(I, 6)
Darr(K, 7) = Arr(I, 7)
End If
Next

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

End Sub
 
Upvote 0
Cảm ơn các bạn đã giúp nhiều. Mình có 2 thắc mắc là
1. Trong code ở trên phần nào là đánh số thứ tự tự động vậy?
2. Với code như thế này tương ứng với 7 cột
Mã:
 Darr(K, 1) = KDarr(K, 2) = Arr(I, 2)
Darr(K, 3) = Arr(I, 3)
Darr(K, 4) = Arr(I, 4)
Darr(K, 5) = Arr(I, 5)
Darr(K, 6) = Arr(I, 6)
Darr(K, 7) = Arr(I, 7)
nếu có 30 môn thì phải làm đến 30 Darr(K,30)=Arr(I,30) luôn phải không? Có cách nào ngắn gọn hơn không các bạn?
Nếu khó quá thì thôi không sao, chỉ là hỏi thêm thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn đã giúp nhiều. Mình có 2 thắc mắc là
1. Trong code ở trên phần nào là đánh số thứ tự tự động vậy?
2. Với code như thế này tương ứng với 7 cột
Mã:
 Darr(K, 1) = KDarr(K, 2) = Arr(I, 2)
Darr(K, 3) = Arr(I, 3)
Darr(K, 4) = Arr(I, 4)
Darr(K, 5) = Arr(I, 5)
Darr(K, 6) = Arr(I, 6)
Darr(K, 7) = Arr(I, 7)
nếu có 30 môn thì phải làm đến 30 Darr(K,30)=Arr(I,30) luôn phải không? Có cách nào ngắn gọn hơn không các bạn?
Nếu khó quá thì thôi không sao, chỉ là hỏi thêm thôi.

Thêm biến c vào dòng này
Mã:
Dim I, K, Arr(), Darr(), D, c As Long

Thay thế đoạn này
Mã:
Darr(K, 2) = Arr(I, 2)
Darr(K, 3) = Arr(I, 3)
Darr(K, 4) = Arr(I, 4)
Darr(K, 5) = Arr(I, 5)
Darr(K, 6) = Arr(I, 6)
Darr(K, 7) = Arr(I, 7)

bằng đoạn này--->nhiều cột hơn vẫn chạy tốt
Mã:
For c = 2 To UBound(Arr, 2)
Darr(K, c) = Arr(I, c)
Next c
---
Lưu ý là giữ nguyên cái này ( Đây là đánh số thứ tự tại cột 1 )
Mã:
Darr(K, 1) = K
 
Upvote 0
Thêm biến c vào dòng này
Mã:
Dim I, K, Arr(), Darr(), D, c As Long

Thay thế đoạn này
Mã:
Darr(K, 2) = Arr(I, 2)
Darr(K, 3) = Arr(I, 3)
Darr(K, 4) = Arr(I, 4)
Darr(K, 5) = Arr(I, 5)
Darr(K, 6) = Arr(I, 6)
Darr(K, 7) = Arr(I, 7)

bằng đoạn này--->nhiều cột hơn vẫn chạy tốt
Mã:
For c = 2 To UBound(Arr, 2)
Darr(K, c) = Arr(I, c)
Next c
---
Lưu ý là giữ nguyên cái này ( Đây là đánh số thứ tự tại cột 1 )
Mã:
Darr(K, 1) = K
Cảm ơn bạn,
Cho mình hỏi đoạn code bên dưới của bạn nó sẽ hiểu có bao nhiêu cột nó lấy bấy nhiêu hay sao?
Mã:
For c = 2 To UBound(Arr, 2)Darr(K, c) = Arr(I, c)
Next c
 
Upvote 0
Cảm ơn bạn,
Cho mình hỏi đoạn code bên dưới của bạn nó sẽ hiểu có bao nhiêu cột nó lấy bấy nhiêu hay sao?
Mã:
For c = 2 To UBound(Arr, 2)Darr(K, c) = Arr(I, c)
Next c

Đúng vậy, mảng Arr() có bao nhiêu cột sẽ được lấy tất nhưng khi nạp dữ liệu cho mảng phải đầy đủ.
Câu lệnh này
Mã:
Arr = .Range(.[A6], .[A6].End(xlDown)).Resize(, 7).Value2

và câu lệnh này
.Range("A6").Resize(K, 7).Value = Darr

Nếu 30 cột thì Resize(, 30) tùy vùng cần tính
 
Upvote 0
Đúng vậy, mảng Arr() có bao nhiêu cột sẽ được lấy tất nhưng khi nạp dữ liệu cho mảng phải đầy đủ.
Câu lệnh này
Mã:
Arr = .Range(.[A6], .[A6].End(xlDown)).Resize(, 7).Value2

và câu lệnh này
.Range("A6").Resize(K, 7).Value = Darr

Nếu 30 cột thì Resize(, 30) tùy vùng cần tính
Cảm ơn bạn. Kiến thức của các bạn rất tốt, càng đi sâu càng thấy mình quá gà mờ. Bạn có thể giải thích giúp mình cái Value2 và Ubound ý nghĩa là gì được không?
 
Upvote 0
Các bạn cho mình hỏi thêm mình muốn lọc ra theo điều kiện "từ ngày" - "đến ngày" trong 3 cột thì phải edit lại code như thế nào? Một lần nữa cảm ơn các bạn nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn. Kiến thức của các bạn rất tốt, càng đi sâu càng thấy mình quá gà mờ. Bạn có thể giải thích giúp mình cái Value2 và Ubound ý nghĩa là gì được không?
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

-----
Các bạn cho mình hỏi thêm mình muốn lọc ra theo điều kiện "từ ngày" - "đến ngày" trong 3 cột thì phải edit lại code như thế nào? Một lần nữa cảm ơn các bạn nhé
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
 

File đính kèm

  • LocTheoNgay.xlsm
    31.5 KB · Đọc: 16
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
 
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

Thì đúng là nói Value2 nhanh hơn Value kia mà
Chỗ đậm đậm ấy là nói về Value2 đấy chứ**~**
 
Upvote 0
Web KT
Back
Top Bottom