Hỏi các bác trên này giải đáp công thức chắc chả bác nào giúp được, một phần vì lười, phần nữa là...khó diễn giải.=INDEX(Dulieu!$L$3:$AM$60;AGGREGATE(15;6;ROW($1:$9999)/(INDEX(Dulieu!$L$3:$AM$60;;MATCH($D$7;Dulieu!$L$1:$AM$1;0))<>"");ROW(D5));MATCH($D$7;Dulieu!$L$1:$AM$1;0))
Các bác viết hộ em thành lời và ý nghĩa từng đoạn với a.
Mình đính kèm file rồi đó. giải thích giúp mình với. Nhất là đoạn "/"Chào bạn @tranthanh2200 ,
Bạn đưa công thức mà không đưa file lên thì ai có thể hình dung được nó như thế nào mà giúp được bạn nhỉ?
Nhà mình ở xã nào ĐH vậy?viết hộ
Thay INDEX bằng OFFSET, còn lại giữ nguyên. "Cải lùi" rồi befaintCông thức kia ai làm mà gớm thế.
Lùi nhưng mà không phải ôm 28 cột.Thay INDEX bằng OFFSET, còn lại giữ nguyên. "Cải lùi" rồi befaint
"Ôm" 1 lần rồi thôi, có buông ra rồi ôm lại đâu mà lo.Lùi nhưng mà không phải ôm 28 cột.![]()
Chú tận tâm quá 1Đây là bài toán trích xuất danh sách con từ 1 danh sách theo điều kiện:
Điều kiện 1: số 22 (đk cột)
Điều kiện 2: các dòng có số liệu ( <>"")
Sau đó dùng INDEX(bảng viền vàng ,đk2, đk1) để lấy từng giá trị khác 0 tại cột N, và copy xuống liên tiếp.
Điều kiện 1 thì dễ rồi, dùng MATCH:
MATCH($D$7,Dulieu!$L$1:$AM$1,0) (với D7 chứa "số: 22") trả về cột thứ 3
Điều kiện 2 thì khó hơn, vì phải tạo mảng liên tiếp {1,3,...} để excel hiểu dòng 1 thì lấy dòng thứ 1 (giá trị 500), copy xuống dòng dưới thì lấy dòng số 3 (giá trị 2000)
View attachment 248780
Giải pháp: Từ excel 2010 về trước, người ta hay dùng tổ hợp SMALL(IF(...row(indirect(...)) để lấy từng giá trị từ nhỏ tới lớn khi copy xuống. Tuy nhiên, công thức lúc này thành công thức mảng, phải dùng Ctrl-shift-enter
Excel mới sau này, người ta dùng hàm AGGREGATE để lấy từng giá trị từ nhỏ tới lớn, tự động bỏ qua giá trị #ERROR qua các tham số, nên chỉ cần Enter là ra kết quả.
Đây là hàm bạn dùng để xác định tham số dòng:
AGGREGATE(15,6,ROW($1:$99)/(INDEX(Dulieu!$L$3:$AM$60,,MATCH($D$7,Dulieu!$L$1:$AM$1,0))<>""),ROW(D1))
Cú pháp: AGGREGATE(x,y,range,n) với x=15 ( lấy từ nhỏ đến lớn), y=6: bỏ qua giá trị lỗi, n=row(D1) =nhỏ nhất cho dòng đầu, nhỏ thứ 2 cho dòng sau,...
Vậy mấu chốt là tạo range bên trong như thế này: {1,3,6,...} tương ứng với vị trí <>"" trong cột N
Ta bắt đầu từ INDEX: vùng bắt đầu từ cột L, dịch chuyển sang phải 3 cột
INDEX(Dulieu!$L$3:$AM$60,,MATCH($D$7,Dulieu!$L$1:$AM$1,0)) tham chiếu đến cột N: {500;0;2000;0;0;300;...}
Đặt điều kiện cho nó <>"", sẽ thành: {true;false;true;false;false;true;...} và excel hiểu true=1, fasle=0
Dùng dãy số liên tiếp từ 1 tới 99 chia cho dãy 1/0, sẽ trả về dãy {1;#N/A;3;#N/A",#N/A",6,..} để lấy thứ tự dòng >0 trong cột N
Lúc này, tại dòng đầu tiên, tham số dòng sẽ là: AGGREGATE(15,6,{1;#N/A;3;#N/A",#N/A",6,..},1) = 1
dòng số 2 sẽ là: AGGREGATE(15,6,{1;#N/A;3;#N/A",#N/A",6,..},2) = 3
Như vậy dòng đầu sẽ là: INDEX(Dulieu!$L$3:$AM$60,1,3)=500
Copy xuống dòng thứ 2 sẽ là: INDEX(Dulieu!$L$3:$AM$60,3,3)=2000
Tương tự, dòng thứ 3 là 300
Tương tự để lấy tên thuốc, lúc này dùng INDEX(Dulieu!B$3:B$60... và không cần điều kiện cột nữa, vì cột đã được xác định. Điều kiện dòng y như công thức lấy SL ở trên.
Đểu hiểu rõ công thức, bạn lên thanh công thức và bôi đen từng phần đầy đủ của các công thức con bên trong, nhấn F9 để xem kết quả tức thời.
Mình ở Minh TiếnNhà mình ở xã nào ĐH vậy?
Công thức kia ai làm mà gớm thế.
đọc song lú một lúc. Cảm ơn bácĐây là bài toán trích xuất danh sách con từ 1 danh sách theo điều kiện:
Điều kiện 1: số 22 (đk cột)
Điều kiện 2: các dòng có số liệu ( <>"")
Sau đó dùng INDEX(bảng viền vàng ,đk2, đk1) để lấy từng giá trị khác 0 tại cột N, và copy xuống liên tiếp.
Điều kiện 1 thì dễ rồi, dùng MATCH:
MATCH($D$7,Dulieu!$L$1:$AM$1,0) (với D7 chứa "số: 22") trả về cột thứ 3
Điều kiện 2 thì khó hơn, vì phải tạo mảng liên tiếp {1,3,...} để excel hiểu dòng 1 thì lấy dòng thứ 1 (giá trị 500), copy xuống dòng dưới thì lấy dòng số 3 (giá trị 2000)
View attachment 248780
Giải pháp: Từ excel 2010 về trước, người ta hay dùng tổ hợp SMALL(IF(...row(indirect(...)) để lấy từng giá trị từ nhỏ tới lớn khi copy xuống. Tuy nhiên, công thức lúc này thành công thức mảng, phải dùng Ctrl-shift-enter
Excel mới sau này, người ta dùng hàm AGGREGATE để lấy từng giá trị từ nhỏ tới lớn, tự động bỏ qua giá trị #ERROR qua các tham số, nên chỉ cần Enter là ra kết quả.
Đây là hàm bạn dùng để xác định tham số dòng:
AGGREGATE(15,6,ROW($1:$99)/(INDEX(Dulieu!$L$3:$AM$60,,MATCH($D$7,Dulieu!$L$1:$AM$1,0))<>""),ROW(D1))
Cú pháp: AGGREGATE(x,y,range,n) với x=15 ( lấy từ nhỏ đến lớn), y=6: bỏ qua giá trị lỗi, n=row(D1) =nhỏ nhất cho dòng đầu, nhỏ thứ 2 cho dòng sau,...
Vậy mấu chốt là tạo range bên trong như thế này: {1,3,6,...} tương ứng với vị trí <>"" trong cột N
Ta bắt đầu từ INDEX: vùng bắt đầu từ cột L, dịch chuyển sang phải 3 cột
INDEX(Dulieu!$L$3:$AM$60,,MATCH($D$7,Dulieu!$L$1:$AM$1,0)) tham chiếu đến cột N: {500;0;2000;0;0;300;...}
Đặt điều kiện cho nó <>"", sẽ thành: {true;false;true;false;false;true;...} và excel hiểu true=1, fasle=0
Dùng dãy số liên tiếp từ 1 tới 99 chia cho dãy 1/0, sẽ trả về dãy {1;#N/A;3;#N/A",#N/A",6,..} để lấy thứ tự dòng >0 trong cột N
Lúc này, tại dòng đầu tiên, tham số dòng sẽ là: AGGREGATE(15,6,{1;#N/A;3;#N/A",#N/A",6,..},1) = 1
dòng số 2 sẽ là: AGGREGATE(15,6,{1;#N/A;3;#N/A",#N/A",6,..},2) = 3
Như vậy dòng đầu sẽ là: INDEX(Dulieu!$L$3:$AM$60,1,3)=500
Copy xuống dòng thứ 2 sẽ là: INDEX(Dulieu!$L$3:$AM$60,3,3)=2000
Tương tự, dòng thứ 3 là 300
Tương tự để lấy tên thuốc, lúc này dùng INDEX(Dulieu!B$3:B$60... và không cần điều kiện cột nữa, vì cột đã được xác định. Điều kiện dòng y như công thức lấy SL ở trên.
Đểu hiểu rõ công thức, bạn lên thanh công thức và bôi đen từng phần đầy đủ của các công thức con bên trong, nhấn F9 để xem kết quả tức thời.