Bạn hoangdanh282vn có thể diễn giải ý nghĩa và từng Name và thuật toán chi tiết được không? Mình đọc hoài về Name nhưng đầu óc ngu muội chưa hiểu hết được. Thấy các bạn và các anh làm hay quá, còn mình thì ...
Gửi Anh phần diễn giải các Name và thuật toán của file gải đáp câu hỏi 1.
Hy vọng giúp được anh.
dk='loc sort'!$E$1
dk là ô chứa điều kiện xếp loại cần lọc
dl=OFFSET('loc sort'!$A$2,,,COUNTA('loc sort'!$A$2:$A$999),1)
dl là số vùng chứa tên học sinh
xl=OFFSET('loc sort'!$A$2,,1,COUNTA('loc sort'!$A$2:$A$999),1)
xl là vùng chứa xếp loại tương ứng với vùng chứa tên hs
ten=TRIM(RIGHT(SUBSTITUTE(TRIM(dl)," "," "),10))&" "
ten là mảng chứa tên các học sinh sau khi đã tách lấy tên và chèn thêm 6 khoảng trắng vào sau tên mới được tách.
ma=" aáàảãạăắằẳẵặâấầẩẫậbcdđeéèẻẽẹêếềểễệfghiíìỉĩịjklmnoóòỏõọôốồổỗộơớờởỡợpqrstuúùủũụưứừửữựvwxyýỳỷỹỵz"
ma là chuỗi text chứa các ký tự sắp sếp theo thứ tự tăng dần từ ký tự khoảng trắng đến ký tự z
soss=SEARCH(LEFT(ten,1),ma)+SEARCH(MID(ten,2,1),ma)/100+SEARCH(MID(ten,3,1),ma)/10^4+SEARCH(MID(ten,4,1),ma)/10^6+SEARCH(MID(ten,5,1),ma)/10^8+SEARCH(MID(ten,6,1),ma)/10^10+ROW(dl)/10^13
soss là số dùng để so sánh thứ tự của các ký tự có trong chuỗi tên của từng học sinh.
SEARCH(LEFT(ten,1),ma) : tìm vị trí của ký tự đầu tiên của chuỗi tên trong chuỗi text (ma) chứa mã các ký tự. Ta tạm gọi là số 1
SEARCH(MID(ten,2,1),ma)/100 : tìm vị trí của ký tự thứ hai của chuỗi tên trong chuỗi text ma, sau đó dem chia cho 100. Mục đích nhằm tạo ra một số >0 và <1. Ta tạm gọi là số 2. Nếu trong khi dò tìm mà có hai số 1 bằng nhau thì ta sẽ xét đến số 2 này. Do số 1 có giá trị lớn nhất là 94 nên ta phải lấy vị trí của ký tự thứ hai chia cho 100
SEARCH(MID(ten,3,1),ma)/10^4 : tìm vị trí của ký tự thứ ba của chuỗi tên trong chuỗi text ma, sau đó dem chia cho 10,000. Mục đích nhằm tạo ra một số >0 và <0.01. Ta tạm gọi là số 3. Nếu trong khi dò tìm mà có hai số 1 bằng nhau, hai số 2 bằng nhau thì ta sẽ xét đến số 3 này.
…..ROW(dl)/10^13 : lấy vị trí dòng chứa tên của mỗi học sinh chia cho 10^13. Sau khi dò tìm mà có sự trùng lắp từ ký tự thứ nhất đến ký tư thứ 6 thì sẽ so sánh đến số này.
row=MAX((SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl))
row là số chỉ dòng của dữ liệu dò tìm nếu thỏa mãn điều kiện dò tìm (xếp loại) và có số soss bé thứ Row()-1 trong tất cả các dòng thỏa mãn điều kiện dò tìm.
(xl=dk) : là mảng TRUE FALE có các phần tử tương ứng với các phần tử có trong mảng xl, nếu phần tử nào bằng với điều kiện thì trả về TRUE, ngược lại trả về FALSE.
(xl=dk)*(soss) : là mảng các phần tử số tương ứng với mảng soss, nếu phấn tử số nào trong mảng soss tương ứng với phần tử TRUE trong mảng (xl=dk) thì sẽ trả về giá trị của phần tử số đó, ngược lại trả vế 0.
(xl=dk)=FALSE : là mảng TRUE FALE có các phần tử tương ứng với các phần tử cá trong mảng (xl=dk), nếu phần tử nào trong mảng (xl=dk) bằng FALSE thì trả về TRUE, ngược lại trả về FALSE.
((xl=dk)=FALSE)*1 : là mảng gồm các phần tử 0 và 1, nếu phần tử nào trong mảng (xl=dk)=FALSE là TRUE thì trả về 1, ngược lại trả về 0.
SUM(((xl=dk)=FALSE)*1) : tính tổng của mảng (xl=dk)=FALSE)*1, mục đích là đếm xem có bao nhiêu dòng trong vùng xl không thỏa mãn điều kiên dọ tìm.
SUM(((xl=dk)=FALSE)*1)+ROW()-1 : tìm vị trí của dòng bé thứ ROW()-1 thỏa mãn điều kiện dò tìm.
SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1) : tìm phần tử bé thứ SUM(((xl=dk)=FALSE)*1)+ROW()-1 trong mảng ((xl=dk)*(soss))
(SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss)) : so sánh mảng SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1) với mảng (soss), sẽ trả về một mãng TRUE FALSE (một TRUE và nhiều FALSE)
(SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl) : tạo ra một mảng chứa các phần tử là vị trí dòng có trong mảng dl, nếu là TRUE thì trả về vị trí dòng, ngược lại trả về 0 (chỉ có 1 phần tử >0, còn lại đều là 0).
MAX((SMALL(((xl=dk)*(soss)),SUM(((xl=dk)=FALSE)*1)+ROW()-1)=(soss))*ROW(dl)) : tìm ra phần từ >0 duy nhất, là vị trí của dòng dữ liệu cần tìm.
Và cuối cùng là công thức dò tìm dựa vào chỉ số dòng cột
=TRIM(IF(ISERR(INDEX(dl,row-1,1)),"",INDEX(dl,row-1,1)))