Lọc nhiều điều kiện từ sheet này sang sheet khác (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,133
Giới tính
Nam
Mình có một Sheets("Data") và một Sheets("Ket Qua")

Trong Sheets("Data") có 9 cột vậy mình muốn lọc nhiều điều kiện sang Sheets(Ket Qua")

Khi gõ vào từ [B2:J2] của Sheets(Ket Qua")TƯƠNG ỨNG theo cột và từ ngày đến ngày thì sẻ lọc

những mã hàng cần lọc, số thứ tự và ngày cần lọc....theo điều kiện lọc


code tối ưu nhất (dữ liệu 65536)...rất mong các bạn tham gia code
cái khó nhất ở đây là cả lọc từ ngày đến ngày kèm theo trong một Sub...

File đính Kèm Link
http://www.mediafire.com/download/a3di7a8tax6ub28/Loc_nhieu_dieu_kien.rar
 
Lần chỉnh sửa cuối:
Mình có một Sheets("Data") và một Sheets("Ket Qua")

Trong Sheets("Data") có 9 cột vậy mình muốn lọc nhiều điều kiện sang Sheets(Ket Qua")

Khi gõ vào từ [B2:J2] của Sheets(Ket Qua")TƯƠNG ỨNG theo cột và từ ngày đến ngày thì sẻ lọc

những mã hàng cần lọc, số thứ tự và ngày cần lọc....theo điều kiện lọc


code tối ưu nhất (dữ liệu 65536)...rất mong các bạn tham gia code
cái khó nhất ở đây là cả lọc từ ngày đến ngày kèm theo trong một Sub...

File đính Kèm Link
http://www.mediafire.com/download/a3di7a8tax6ub28/Loc_nhieu_dieu_kien.rar

Dùng Advanced Filter cái xoẹt là ra chứ gì
 
Upvote 0
bảng đk là 1 dòng tiêu đề, 2 dòng điều kiện
dòng điều kiện 1 khác dòng đk 2 ở ô ngày tháng

bài dạng này nếu code chuẩn đẹp có tham số truyền kiểu tham trị, kiểu tham biến thì mới so sánh được code như thế nào là tối ưu, chứ 1 bảng thì chưa thấy tối ưu trong cách viết đâu
ví dụ lấy dữ liệu từ 5 bảng, vào chung 1 bảng, các cột lấy nằm vị trí khác nhau, nhưng các cột lấy đều có trong 5 bảng đó, và mình phải viết 1 sub như thế nào mà nó lấy tât cả. hay là phải viết code 5 lần mỗi bảng 1 code
 
Lần chỉnh sửa cuối:
Upvote 0
bảng đk là 1 dòng tiêu đề, 2 dòng điều kiện
dòng điều kiện 1 khác dòng đk 2 ở ô ngày tháng

bài dạng này nếu code chuẩn đẹp có tham số truyền kiểu tham trị, kiểu tham biến thì mới so sánh được code như thế nào là tối ưu, chứ 1 bảng thì chưa thấy tối ưu trong cách viết đâu
ví dụ lấy dữ liệu từ 5 bảng, vào chung 1 bảng, các cột lấy nằm vị trí khác nhau, nhưng các cột lấy đều có trong 5 bảng đó, và mình phải viết 1 sub như thế nào mà nó lấy tât cả. hay là phải viết code 5 lần mỗi bảng 1 code
Viết một sub mà đạt theo các điều kiện và từ ngày đến ngày mới khó chứ 5 sub thì thôi vậy.....

Tối ưu ở đây hiểu theo kiểu nông dân của mình là vầy: với dữ liệu đó code mình chạy 15 phút ra kết

quả
còn code của Bạn 1 giây là xong vậy là tối ưu rồi...còn nói thuật nọ thuật kia mình không hiểu
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có một Sheets("Data") và một Sheets("Ket Qua")

Trong Sheets("Data") có 9 cột vậy mình muốn lọc nhiều điều kiện sang Sheets(Ket Qua")

Khi gõ vào từ [B2:J2] của Sheets(Ket Qua")TƯƠNG ỨNG theo cột và từ ngày đến ngày thì sẻ lọc

những mã hàng cần lọc, số thứ tự và ngày cần lọc....theo điều kiện lọc


code tối ưu nhất (dữ liệu 65536)...rất mong các bạn tham gia code
cái khó nhất ở đây là cả lọc từ ngày đến ngày kèm theo trong một Sub...

File đính Kèm Link
http://www.mediafire.com/download/a3di7a8tax6ub28/Loc_nhieu_dieu_kien.rar
Tôi làm thử cho bạn 2 điều kiện.
Mã:
Sub LayDL()
Dim cn As Object
Dim rst As Object
Set cn = CreateObject("ADODB.connection")
cn.Open ("Provider=microsoft.ace.oledb.12.0;data source=" & ThisWorkbook.FullName & ";extended properties=""Excel 12.0;HDR=No"";")
With Sheet2
    Set rst = cn.Execute("select * " & _
                         "from [Data$B4:J65000] " & _
                         "where F2 like '" & IIf(Len(.[C2]) = 0, "%", .[C2]) & _
                                "' and format(F9,'yyyy-MM-dd')  >= '" & Format(.[J1], "yyyy-MM-dd") & _
                                "' and format(F9,'yyyy-MM-dd') <='" & Format(.[J2], "yyyy-MM-dd") & "'")
    .[B4:J100].ClearContents
    .Range("B4").CopyFromRecordset rst
End With
End Sub
 

File đính kèm

Upvote 0
Tôi làm thử cho bạn 2 điều kiện.
Mã:
Sub LayDL()
Dim cn As Object
Dim rst As Object
Set cn = CreateObject("ADODB.connection")
cn.Open ("Provider=microsoft.ace.oledb.12.0;data source=" & ThisWorkbook.FullName & ";extended properties=""Excel 12.0;HDR=No"";")
With Sheet2
    Set rst = cn.Execute("select * " & _
                         "from [Data$B4:J65000] " & _
                         "where F2 like '" & IIf(Len(.[C2]) = 0, "%", .[C2]) & _
                                "' and format(F9,'yyyy-MM-dd')  >= '" & Format(.[J1], "yyyy-MM-dd") & _
                                "' and format(F9,'yyyy-MM-dd') <='" & Format(.[J2], "yyyy-MM-dd") & "'")
    .[B4:J100].ClearContents
    .Range("B4").CopyFromRecordset rst
End With
End Sub
Xin cảm ơn Bạn đã tham gia
nếu lọc Date thì mình dùng Array hay Ado của bạn và kèm theo một sub AF nữa là được ... nhưng điều đó mình cũng chưa thật sự mong muốn nếu hết cách thì mình mới làm vậy...
 
Upvote 0
Xin cảm ơn Bạn đã tham gia
nếu lọc Date thì mình dùng Array hay Ado của bạn và kèm theo một sub AF nữa là được ... nhưng điều đó mình cũng chưa thật sự mong muốn nếu hết cách thì mình mới làm vậy...
Là sao bạn? ADO có lợi thế là lọc nhanh và đơn giản, có thể truy vấn ở dữ liệu lớn, bạn muốn cần thêm điều kiện nữa thì cứ thêm vào, đâu cần sub phụ nữa làm gì.
 
Upvote 0
Xin cảm ơn Bạn đã tham gia
nếu lọc Date thì mình dùng Array hay Ado của bạn và kèm theo một sub AF nữa là được ... nhưng điều đó mình cũng chưa thật sự mong muốn nếu hết cách thì mình mới làm vậy...
Vậy chờ người khác giúp nhé, tôi dừng lại ở đây.
 
Upvote 0
Là sao bạn? ADO có lợi thế là lọc nhanh và đơn giản, có thể truy vấn ở dữ liệu lớn, bạn muốn cần thêm điều kiện nữa thì cứ thêm vào, đâu cần sub phụ nữa làm gì.
Vấn đề là thêm vào như thế nào đây ADo thì mình Toàn sử dụng ké cái Function của anh hải và

code của Bạn thôi ....VBA thì mình hiểu và chế được chứ ADO thì gần như tịt mỗi lần cần viết cái gì

lại mở cái Function của Anh Hải hay code của Bạn lên coi mới viết được...

vậy nhờ bạn thêm vao cho mình nhé
 
Upvote 0
Vấn đề là thêm vào như thế nào đây ADo thì mình Toàn sử dụng ké cái Function của anh hải và

code của Bạn thôi ....VBA thì mình hiểu và chế được chứ ADO thì gần như tịt mỗi lần cần viết cái gì

lại mở cái Function của Anh Hải hay code của Bạn lên coi mới viết được...

vậy nhờ bạn thêm vao cho mình nhé
Vấn đề ở chổ là cột D->G lọc như thế nào? Không lẻ con số phải lọc chính xác? Không ai làm vậy bao giờ.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nếu không kèm theo lọc từ ngày đến ngày thì em làm được ....còn kèm theo ngày nữa thì tịt....

Mong Anh cho em một code học tập
Bạn xem trong file. Vùng có viền đỏ là vùng điều kiện để dùng Advanced Filter, vùng có màu nền xanh là vùng nhập điều kiện.

Code thì tự bạn viết nhé.
 

File đính kèm

Upvote 0
Bạn xem trong file. Vùng có viền đỏ là vùng điều kiện để dùng Advanced Filter, vùng có màu nền xanh là vùng nhập điều kiện.

Code thì tự bạn viết nhé.
Cách này mình cũng đã từng sử dụng AF vọc qua cách đây khoãng 1 tháng gì đó nhưng nó sai chỗ nào đó mà chưa ra kết quả ....để mình thử lại theo hướng này xem sao
cảm ơn Bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không kèm theo lọc từ ngày đến ngày thì em làm được ....còn kèm theo ngày nữa thì tịt....

Ủa? Lọc từ ngày đến ngày là chuyện bình thường mà! Điều kiện >=Từ ngày và thêm cái <=Đến ngày là xong chứ gì
Ngoài ra bạn nên đưa dữ liệu thật lên để test cho chắc. Vì bạn có nói:

code tối ưu nhất (dữ liệu 65536)...rất mong các bạn tham gia code
nên mấy vụ này không thể giả lập dữ liệu tùy tiện được đâu
 
Upvote 0
Ủa? Lọc từ ngày đến ngày là chuyện bình thường mà! Điều kiện >=Từ ngày và thêm cái <=Đến ngày là xong chứ gì
Ngoài ra bạn nên đưa dữ liệu thật lên để test cho chắc. Vì bạn có nói:

nên mấy vụ này không thể giả lập dữ liệu tùy tiện được đâu
Dạ ... Em úp dữ liệu thật lên nhờ Anh giúp

Cảm ơn Anh

Link File đính kèm
http://www.mediafire.com/download/30qk5b67xo8o794/Loc_nhieu_dieu_kienFull.rar
 
Upvote 0
Dạ ... Em úp dữ liệu thật lên nhờ Anh giúp

Cảm ơn Anh

Link File đính kèm
http://www.mediafire.com/download/30qk5b67xo8o794/Loc_nhieu_dieu_kienFull.rar

Thì cách làm giống như của huuthang_bd vậy đấy!
Muốn code cũng sẽ dùng AF như sau:
Mã:
Sub Main()
  Dim rngData As Range, rngCriteria As Range, rngTarget As Range
  Set rngData = Sheets("Data").Range("A3:I100000")
  Set rngCriteria = Sheets("Ket Qua").Range("A1:J2")
  Set rngTarget = Sheets("Ket Qua").Range("A3:I3")
  rngData.AdvancedFilter 2, rngCriteria, rngTarget
End Sub
Ngắn gọn không?
Với dữ liệu 65536 dòng của bạn cho kết quả trong nháy mắt
-------------
Lưu ý: Những chỗ tô màu trong file là những chỗ cho bạn gõ điều kiện tìm vào
 

File đính kèm

Upvote 0
Thì cách làm giống như của huuthang_bd vậy đấy!
Muốn code cũng sẽ dùng AF như sau:
Mã:
Sub Main()
  Dim rngData As Range, rngCriteria As Range, rngTarget As Range
  Set rngData = Sheets("Data").Range("A3:I100000")
  Set rngCriteria = Sheets("Ket Qua").Range("A1:J2")
  Set rngTarget = Sheets("Ket Qua").Range("A3:I3")
  rngData.AdvancedFilter 2, rngCriteria, rngTarget
End Sub
Ngắn gọn không?
Với dữ liệu 65536 dòng của bạn cho kết quả trong nháy mắt
-------------
Lưu ý: Những chỗ tô màu trong file là những chỗ cho bạn gõ điều kiện tìm vào
Code xúc tích ngắn gọn, dễ hiểu và tốc độ ....AdvancedFilter quả là siêu việt....

PS: Em mới kiểm tra lại mã hàng nó lọc không chính xác VD Viettel 10 thì nó lọc ra Vitett 10 và Viettel 100 . các mà hàng khác cũng vậy nó không nhận thêm một số không nữa ở sau đó
 
Lần chỉnh sửa cuối:
Upvote 0
PS: Em mới kiểm tra lại mã hàng nó lọc không chính xác VD Viettel 10 thì nó lọc ra Vitett 10 và Viettel 100 . các mà hàng khác cũng vậy nó không nhận thêm một số không nữa ở sau đó
Đó có lẽ do kí tự đại diện trong excel nó hại bạn

Muốn lọc chỉ V 10 không lọc V 100 thì bạn cần chính xác hóa điều kiện lọc, như ="=" & "V 10"
 
Upvote 0
PS: Em mới kiểm tra lại mã hàng nó lọc không chính xác VD Viettel 10 thì nó lọc ra Vitett 10 và Viettel 100 . các mà hàng khác cũng vậy nó không nhận thêm một số không nữa ở sau đó

Advanced Filter nó vậy đấy!
Để lọc chính xác Viettel 10, bạn phải nhập vào ô điều kiện là: '=Viettel 10 (dấu nháy đơn rồi đến dấu bằng)
 
Upvote 0
Advanced Filter nó vậy đấy!
Để lọc chính xác Viettel 10, bạn phải nhập vào ô điều kiện là: '=Viettel 10 (dấu nháy đơn rồi đến dấu bằng)
Sao mà Advanced Filter nó chứng vậy chứ ....Em cũng không nghĩ là hết cách ...chắc chắn sẽ còn hướng nào khác như Chạy For Next chẳng hạn
 
Upvote 0
nếu bạn dùng vòng lặp thì ok, bạn có thể làm theo hướng sau (máy tôi bị hư nên không code được)
dong =0
tìm dòng cuối
Duyệt từ đầu đến cuối (dùng For)
Kiểm tra đk (đk này là 1 đống mà bạn đưa ra) ví dụ như (rng(i,1)=dk1, and rng(i,2)=dk2 and ....
nếu đk đúng
số dòng =số dòng +1
arr(dong,1)=rng(i,1)
arr(dong,2)=rng(i,2)
arr(dong,3)=rng(i,3)
arr(dong,4)=rng(i,4)
.................
kết thúc if
kết thúc for
gán xuống sheet
 
Upvote 0
Sao mà Advanced Filter nó chứng vậy chứ

Quy định nó vậy (đọc trong help)
Bạn hãy nghĩ rằng đây chính là ƯU ĐIỂM của AF chứ đừng nên nghĩ nó CHỨNG chứ
--------------
.Em cũng không nghĩ là hết cách ...chắc chắn sẽ còn hướng nào khác như Chạy For Next chẳng hạn
Bạn có thể thử mà!
Riêng tôi thì cảm thấy dùng For... Next quá rắc rối, bởi ta có biết trước ta cần lọc điều kiện gì đâu mà viết
 
Upvote 0
nếu bạn dùng vòng lặp thì ok, bạn có thể làm theo hướng sau (máy tôi bị hư nên không code được)
dong =0
tìm dòng cuối
Duyệt từ đầu đến cuối (dùng For)
Kiểm tra đk (đk này là 1 đống mà bạn đưa ra) ví dụ như (rng(i,1)=dk1, and rng(i,2)=dk2 and ....
nếu đk đúng
số dòng =số dòng +1
arr(dong,1)=rng(i,1)
arr(dong,2)=rng(i,2)
arr(dong,3)=rng(i,3)
arr(dong,4)=rng(i,4)
.................
kết thúc if
kết thúc for
gán xuống sheet
Mình đọc bài của bạn tới lui cũng không hiểu ...
Nếu được nhờ Bạn viết cho một code hoc tập nha
 
Upvote 0
Code xúc tích ngắn gọn, dễ hiểu và tốc độ ....AdvancedFilter quả là siêu việt....

PS: Em mới kiểm tra lại mã hàng nó lọc không chính xác VD Viettel 10 thì nó lọc ra Vitett 10 và Viettel 100 . các mà hàng khác cũng vậy nó không nhận thêm một số không nữa ở sau đó
Ai muốn luyện AF thì phải hiểu rõ TRUE và FALSE trong AF thì mới phát huy được công dụng của AF. Vụ này mình cũng mất khá nhiều thời gian đấy.
 
Upvote 0
Ai muốn luyện AF thì phải hiểu rõ TRUE và FALSE trong AF thì mới phát huy được công dụng của AF. Vụ này mình cũng mất khá nhiều thời gian đấy.
Thì bài #14 em cũng có nói rồi đó cách đây gần 1 tháng gì đó em vọc theo hướng AF các kiểu mà ko ra kết quả .... cuối cùng thì Em đã hiểu AF là vậy đó
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom