Rất xin lỗi bác. E đã test lại công thức của bác ra kết quả đúng rồi ah. E chưa hiểu ý nghĩa của việc thay thế 1 mảng MATCH bằng ROW($1:$50), nhờ bác chỉ giúp ah.
Lẽ ra việc đọc và hiểu FREQUENCY thuộc về bạn.
Nếu bạn hiểu FREQUENCY với MATCH thứ 2 (vì không thấy bạn kêu) thì tại sao lại không hiểu FREQUENCY với ROW(...)?
IF((C6:C49>=H2)*(C6:C49<=I2);MATCH(A6:A49;A6:A49;0)) sẽ trả về mảng tmp có 1 cột 44 dòng. Nếu dòng nào trong C6:C49 không thỏa điều kiện (đk) về ngày thì giá trị tương ứng trong mảng tmp là False, ngược lại thì giá trị tương ứng trong mảng tmp sẽ là vị trí tính từ 1 của giá trị tương ứng trong cột A trong mảng A6:A49. Một điều đáng chú ý là nếu Ci, Cj đều thỏa đk và Ai = Aj, với i < j, thì giá tri thứ (j-5) = giá trị thứ (i-5) (trong mảng tmp) = vị trí của Ai trong mảng A6:A49 . Cái này do MATCH quyết định (đọc trợ giúp về MATCH).
Vd. C12, C19 và C35 thỏa đk, và A12 = A19 = A35 = NGUYEN7. Khi tìm A12, A19 hoặc A35 trong A6:A49 thì MATCH đều trả về 7 = vị trí xuất hiện lần đầu tiên của NGUYEN7 tại A12.
Do các khách hàng giống nhau thì tương ứng với những số giống nhau trong mảng tmp nên nếu gọi số khách hàng (duy nhất) là x thì x cũng chính là số các phần tử duy nhất ngoài False trong mảng tmp. Vậy chỉ cần tính số phần tử duy nhất trong mảng tmp, ngoài False. Để tính x thì ta dùng FREQUENCY.
FREQUENCY bỏ qua, không xét, coi như là không khí các giá trị False.
FREQUENCY(IF(...);ROW($1:$50)) trả về mảng tmp1 có 1 cột 51 dòng.
Giả sử n dòng <> False trong mảng tmp có giá trị 1 ≤ x1 < x2 < ... < xn ≤ số dòng trong vùng dữ liệu.
Lúc đó các phần tử từ 1 tới x1-1 trong mảng tmp1 = 0, phần tử thứ x1 trong mảng tmp1 = số lần mà x1 xuất hiện trong mảng tmp, tức ≥ 1, các phần tử từ x1+1 tới x2-1 bằng 0, ..., phần tử thứ xn trong mảng tmp1 = số lần mà xn xuất hiện trong mảng tmp, tức ≥ 1, các phần tử từ xn+1 tới cuối cùng đều = 0.
Cụ thể trong mảng tmp số 5 xuất hiện 2 lần, 6 xuất hiện 2 lần và 7 xuất hiện 3 lần, còn lại là False. Tức tmp1(1) = tmp1(2) = tmp1(3) = tmp1(4) = 0. tmp1(5) = 2, tmp1(6) = 2, tmp1(7) = 3. Còn lại tmp1(8) = tmp1(9) = ... = tmp1(51) = 0.
(tmp1 > 0) trả về mảng tmp2 có 1 cột 51 dòng mà tmp2(1) = tmp2(2) = tmp2(3) = tmp2(4) = FALSE, tmp2(5) = tmp2(6) = tmp2(7) = TRUE, tmp2(8) = tmp2(9) = ... = tmp2(51) = FALSE.
--(tmp1 > 0), tức --tmp2 trả về mảng result mà result(1) = result(2) = result(3) = result(4) = 0, result(5) = result(6) = result(7) = 1, result(8) = result(9) = ... = result(51) = 0.
Rõ ràng trong mảng result.có đúng x giá trị 1 còn lại là các giá trị 0. Vậy SUM những giá trị này là có kết quả. Thế thôi.
Do trong trường hợp xấu nhất / tốt nhất tất cả các giá trị trong mảng tmp đều <> False và khác nhau từng đôi một (khi các dòng của C6:C49 đề thỏa đk và các giá trị trong A6:A49 khác nhau từng đôi một), tức tmp là mảng chứa các giá trị (1, 2, ..., số dòng dữ liệu). Để FREQUENCY trả về đủ các giá trị thì trong ROW(...) cận trên ít nhất phải = số dòng vùng dữ liệu. Có thể chọn số tùy ý miễn >= số dòng vùng dữ liệu.
Tôi viết dài. Hi vọng không gõ nhầm chỗ nào.