pro ndu giúp em tí nữa nhé, mấy bữa nay em coi hoài cái bài của bác nhưng vẫn chưa hiểu được vấn đề sau:
1- làm sao để lấy ra được địa chỉ của 1 ô nào đó thỏa điều kiện trong name dt?
2- làm sao để tên khi lọc ra thỏa điều kiện xếp liên tiếp nhau, mạc dù trong bảng dữ liệu những tên này ở xa nhau?
mong hồi âm của bác, em định tự học, nhưng bữa giờ coi ko hiểu nên mới lại làm phiền bác tiếp.
Bài trên sử dựng công thức mảng để trích lọc.
Để hiểu rõ về công thức mảng thì đòi hỏi phải có một kiện thức nhất định nào đó. Trước khi làm một vấn đề gì thì ta phải hiểu rõ vấn đề đó, phân tích và đưa ra giải pháp, sau đó ta sẽ thực thi giải pháp đó bằng các công thức.
Với bài trên thì mình xin mô tả sơ về giải pháp như sau :
1. Xác định vùng dữ liệu là từ A2:B21 (sử dụng hàm offset trong Name DS)
2. Trong vùng dữ liệu, lấy vùng tuổi đem so sánh với điều kiện cho trước (F1 và H1). Nếu không thỏa mãn thì trả về rỗng "", ngược lại sẽ trả về thứ tự dòng trong vùng dữ liệu. Cụ thể, ở ví dụ trên, Name
VT sẽ trả về kết quả việc so sánh trên, kết quả đạt được sẽ là một mảng chứa các phần tử rỗng và các phần tử chỉ rõ thứ tự dòng tương ứng :
VT={"";"";3;4;"";6;"";"";"";10;11;12;"";"";"";16;17;18;19;20}
Trong các phần tử trong VT, phần tử rỗng sẽ có giá trị lớn hơn phần tử số.
3. Lần lượt tìm ra phần tử nhỏ thứ ROWS($n:n) có trong VT, nếu phần tử nhỏ thứ n mà là rỗng "" thì sẽ trả về rỗng, ngược lại trả về giá trị của phần tử đó. Điều này có nghĩa khi công thức kết quả đang nằm ở ô J2 thì Rows($n:n) = Rows($1:1)=1, phần tử nhỏ thứ 1 sẽ là :
SMALL(VT,ROWS($1:1))=3
Tương tự :
phần tử nhỏ thứ 2 (ô J3) sẽ là :
SMALL(VT,ROWS($1:1))=4
phần tử nhỏ thứ 3 (ô J4) sẽ là :
SMALL(VT,ROWS($1:2))=6
.....
phần tử nhỏ thứ 11 sẽ là :
SMALL(VT,ROWS($1:10))=19
phần tử nhỏ thứ 12 sẽ là :
SMALL(VT,ROWS($1:11))=20
phần tử nhỏ thứ 13 sẽ là :
SMALL(VT,ROWS($1:12))=#NUM!
....
4. Ta biết rằng giá trị của phần tử nhỏ thứ n (giá trị thỏa mãn điều kiện so sánh) trong VT sẽ ứng với vị trí thứ n của dòng dữ liệu DS. Vì vậy, để lấy được dữ liệu tại dòng thứ n thì ta dùng hàm Index để lấy kết quả.
INDEX(DS,SMALL(VT,ROWS($1:1)),1)="C"
INDEX(DS,SMALL(VT,ROWS($1:2)),1)="d"
INDEX(DS,SMALL(VT,ROWS($1:3)),1)="ds"
...
INDEX(DS,SMALL(VT,ROWS($1:12)),1)=#NUM!
....
Để tránh lỗi trả về #NUM! thì ta kết hợp thêm hàm Count
ROWS($n:n)>COUNT(VT)
Nếu như phần tử thứ n mà lớn hơn số phần tử số có trong VT thì trả về rỗng.
Cụ thể :
=IF(ROWS($1:11)>COUNT(VT),"",INDEX(DS,SMALL(VT,ROWS($1:11)),1))
<=>
=IF(11>11,"","tyjukj")
=IF(ROWS($1:12)>COUNT(VT),"",INDEX(DS,SMALL(VT,ROWS($1:12)),1))
<=>
=IF(12>11,"",#NUM!)
...