Mời thử sức bài toán lọc 2 điều kiện, không dùng cột phụ (2 người xem)

  • Thread starter Thread starter DOSNET
  • Ngày gửi Ngày gửi
Liên hệ QC

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

DOSNET

Thành viên gắn bó
Thành viên danh dự
Tham gia
3/8/07
Bài viết
1,633
Được thích
2,370
Nghề nghiệp
E&A
Chào các bạn, chúng ta đã khá quen thuộc với những bài lọc dùng công thức và name, Dosnet mời các bạn thử sức với một bài lọc ngày tháng với hai điều kiệnkhông dùng cột phụ.

Yêu cầu:
-Dùng công thức để lọc theo 2 điều kiện tháng và năm tại H5 và H6
-Không dùng cột phụ
-Nếu tháng tại H4 để trống thì lọc toàn bộ dữ liệu có năm = năm tại H5, tương tự nếu năm tại H5 để trống thì lọc toàn bộ dữ liệu có tháng trùng với tháng tại H4.
-Nếu để trống H4 và H5 thì show toàn bộ dữ liệu.

Mời những bạn mới thực hành về name và công thức cùng tham gia. Chúc vui!
 

File đính kèm

Lâu lâu có bài toán hay cũng thấy vui. Anh xem file đính kèm nha
 

File đính kèm

Bài này, nếu như mà dùng Excel 2007 thì sướng lắm, chả cần tí công thức nào vẫn có thể lọc, thậm chí đến 3 điều kiện (lọc theo tháng, theo năm, theo ngày), muốn lọc cái gì thì nhấn chọn cái đó...
000-2193.jpg
 
Bài này, nếu như mà dùng Excel 2007 thì sướng lắm, chả cần tí công thức nào vẫn có thể lọc, thậm chí đến 3 điều kiện (lọc theo tháng, theo năm, theo ngày), muốn lọc cái gì thì nhấn chọn cái đó...
Ấy... Excel 2003 cũng làm được vậy! Có điều phải tốn công hơn 1 tí: Lọc 2 lần (nếu lọc theo ngày thì lọc 3 lần)
- Đầu tiên Format cột C = m ---> Lọc ra tháng đúng với điều kiện
- Với DS đã lọc, Format cột C = yyyy ---> Lọc ra năm đúng điều kiện
Nói chung cũng khá dể dang ---> vấn đề ở đây là tác giả yêu cầu chúng ta giải bằng công thức
Đây là dịp cho các bạn mới (như Volga) nâng cao tay nghề đây... Ẹc... Ẹc...
(Hoangdanh làm chi vội thế)
 
Cám ơn Hoàng Danh đã có bài giải sớm nhất, Dosnet xin gửi đáp án của mình. Vẫn là bài lọc phổ thông nhưng name STT được thay đổi một chút, từ đây ta có thể mở thêm nhiều điều kiện dễ dàng, Bài này tôi sử dụng 2 name như sau:


Mã:
DATA=OFFSET(Sheet1!$C$2,,,COUNTA(Sheet1!$C$2:$C$1000))

STT=IF((MONTH(DATA)=Sheet1!$H$4)+(YEAR(DATA)=Sheet1!$H$5)=COUNTA(Sheet1!$H$4:$H$5),ROW(INDIRECT("1:"&COUNTA(DATA))),"")
Gửi các bạn file đính kèm.
 

File đính kèm

Lần chỉnh sửa cuối:
Ấy... Excel 2003 cũng làm được vậy! Có điều phải tốn công hơn 1 tí: Lọc 2 lần (nếu lọc theo ngày thì lọc 3 lần)
- Đầu tiên Format cột C = m ---> Lọc ra tháng đúng với điều kiện
- Với DS đã lọc, Format cột C = yyyy ---> Lọc ra năm đúng điều kiện
Nói chung cũng khá dể dang ---> vấn đề ở đây là tác giả yêu cầu chúng ta giải bằng công thức
Đây là dịp cho các bạn mới (như Volga) nâng cao tay nghề đây... Ẹc... Ẹc...
(Hoangdanh làm chi vội thế)

Cám ơn Anh !
Nếu lọc một đk thì em có thể tập tành lui tới chứ 2 đk thì em chưa thử sức bao giờ !
Làm không ra luôn chứ ...+-+-+-+Ngày hôm qua là ngày đẹp nhất đấy .Em hiểu ra được nhiều thứ từ loạt bài này vui bà cố hi hi
Thanks All !
 
Cám ơn Anh !
Nếu lọc một đk thì em có thể tập tành lui tới chứ 2 đk thì em chưa thử sức bao giờ !
Làm không ra luôn chứ ...+-+-+-+Ngày hôm qua là ngày đẹp nhất đấy .Em hiểu ra được nhiều thứ từ loạt bài này vui bà cố hi hi
Thanks All !
Theo điều kiện lọc thì bài này có 4 trường hợp xãy ra:
- Năm <> rổng và Tháng <> rổng
- Năm rổng và tháng <> rổng
- Năm <> rổng và tháng rổng
- Năm và tháng cùng rổng

Vậy bạn Volga cứ làm theo trường hợp 1 trước, không khó lắm đâu
Lưu ý 1 chuyện: Thông thường khi kết hợp 2 điều kiện ta dùng ANDOR, theo kiểu:
IF(AND(XX=đk1,xx=đk2),.....)
nhưng vói công thức mãng thì không được, làm thế này:
IF(AND(MONTH(DATA)=Tháng,YEAR(DATA)=Năm)....
nó sẽ cóc ra
Phải dùng toán tử * hoặc +
Ví dụ:
IF((MONTH(DATA)=Tháng)*(YEAR(DATA)=Năm),....)
Dấu * này tương đương với AND
Như DOSNET dùng + là tương đương với OR đấy
 
Bài này Dosnet đã từng vắt óc nghĩ không ra, cuối cùng chụp được chỗ này ở name STT.

STT=IF((MONTH(DATA)=$H$4)+(YEAR(DATA)=$H$5)=COUNTA($H$4:$H$5),ROW(INDIRECT("1:"&COUNTA(DATA))),"")

Mảng ROW(..) làm việc với 3 trường hợp:

1- Cả tháng và năm đều rỗng : Điều kiện = 0 thì lấy đưa dữ liệu vào mảng

2- Một trong hai điều kiện tháng hoặc năm rỗng, cộng hai mảng điều kiện, nếu bằng 1 thì lấy đưa dữ liệu vào mảng

3- Có dữ liệu cả tháng và năm, cộng hai mảng điều kiện, nếu bằng 2 thì lấy đưa dữ liệu vào mảng

Và dùng COUNTA($H$4:$H$5) ở đây thật hợp lý. thật dễ dàng khi ta mở rộng ra với nhiều điều kiện.
 
Lần chỉnh sửa cuối:
Nhờ bạn Dosnet giải thích chỗ này ở name STT;


Trích:
STT=IF((MONTH(DATA)=$H$4)+(YEAR(DATA)=$H$5)=COUNTA($H$4:$H$5),ROW(INDIRECT("1:"&COUNTA(DATA))),"")


Mảng ROW(..) làm việc với 3 trường hợp:

1- Cả tháng và năm đều rỗng : Điều kiện = 0 thì lấy đưa dữ liệu vào mảng

2- Một trong hai điều kiện tháng hoặc năm rỗng, cộng hai mảng điều kiện, nếu bằng 1 thì lấy đưa dữ liệu vào mảng

3- Có dữ liệu cả tháng và năm, cộng hai mảng điều kiện, nếu bằng 2 thì lấy đưa dữ liệu vào mảng

Và dùng COUNTA($H$4:$H$5) ở đây thật hợp lý. thật dễ dàng khi ta mở rộng ra với nhiều điều kiện.

Bạn giải thích giùm cái công thức STT nhất là ở cái phần ROW(INDIRECT("1:"&COUNTA(DATA))),"")
Khi mảng ở các toán tử điều kiện của công thức không rỗng thì đúng rồi còn khi nó rỗng thị STT sẽ " không có gì" phải không.
Vậy thì tại bảng kết quả lọc tại sao nó lại ra cả bảng vì lúc này nó có còn cái Small nào nữa đâu để cho hàm offset(index(.......) dò tìm
Xin cảm ơn bạn
 
STT=IF((MONTH(DATA)=$H$4)+(YEAR(DATA)=$H$5)=COUNTA($H$4:$H$5),ROW(INDIRECT("1:"&COUNTA(DATA))),"")

Giải thích về điều kiện tại sao lại COUNTA($H$4:$H$5) thì Dosnet đã đề cập ở bài trên, Trước hết ta cần tìm hiểu name động STT đóng vai trò gì trong công thức, xét một name STT đơn giản hơn :

Với DATA là vùng dữ liệu bạn cần lọc, bạn có thể thay thế name động DATA bằng một vùng xác định, Ví dụ: DATA= ($C$1:$C$5)={8,18,45,6,20}

Trước hết bạn cần tách công thức để tìm hiểu name STT làm việc như thế nào, xét name công thức giản sau:

DATA1=IF(điều kiện,DATA,"")

Làm ví dụ với điều kiện (DATA>9) hàm trên trả về mảng dữ liệu có độ lớn tương đương với DATA và những dòng không thỏa mãn điều kiện lọc sẽ thay thế bằng ký tự trống "". DATA1={"",18,45,"",20}

STT=IF(Điều kiện,ROW(INDIRECT("1:"&COUNTA(DATA))),"")

-Hàm ROW sẽ trả về một mảng giá trị (là các vị trí dòng thỏa mãn điều kiện) từ 1 tới 5, những dòng thỏa mãn điều kiện sẽ lấy vị trí dòng (Chứ không phải giá trị), những dòng không thỏa mãn Đk sẽ thay bằng ký tự trống. STT={"",2,3,"",5}

Việc còn lại là sự kết hợp khéo léo giữa hai hàm Index và Small để lọc ra những dòng theo yêu cầu của bạn. Ban nghiên cứu dần dần nhé !
 
Help me dosnet :(

Nhờ bạn dosnet chỉ giúp mình bài này với, mình đọc bài của bạn mà vẫn chưa hiểu ra để ứng dụng vào bài của mình. Bạn giải thích giùm mình nhé,

Thank so much
 

File đính kèm

Lâu lâu có bài toán hay cũng thấy vui. Anh xem file đính kèm nha
Cảm ơn anh Hoangdanh, anh cho em hỏi ý nghĩa của hàm Indirect mà anh dùng cho em hiểu với, em đọc nhiều về nó mà vẫn lơ tơ mơ, cho em hỏi nếu không dùng Indirect trong bài này được không, em cứ ngại ngại cái thằng này lắm./.
 
Cảm ơn bác Dosnet, hôm nay học được công thức

PHP:
STT=IF((MONTH(DATA)=Sheet1!$H$4)+(YEAR(DATA)=Sheet1!$H$5)=COUNTA(Sheet1!$H$4:$H$5),ROW(INDIRECT("1:"&COUNTA(DATA))),"")

của bác rất hay
 
Lần chỉnh sửa cuối:
Ngoài các điều kiện ngày tháng năm anh cho thêm ví dụ thêm các điều kiện khác không phải ngày tháng năm được không ?
 
Web KT

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

Back
Top Bottom