Lookup(1, 1/...) hoặc Lookup(2, 1/...) là một xảo thuật (lưu ý từ xảo thuật có nghĩa là một mánh khoé, không phải là kỹ thuật chính thống) thường dùng cho một trong hai trường hợp sau đây:
1. tìm với nhiều điều kiện (ở phạm vi thớt này không thấy nói tới)
2. tìm với mảng không được sắp xếp và muốn tìm trị xuất hiện cuối cùng thay vì đầu tiên (hàm Match cũng dò được mảng không sắp xếp nhưng nó lấy trị đầu tiên)
Muốn biết tại sao có cái vụ 2,1 thì phải hiểu nguyên tắc của dò mảng sắp xếp.
Đối với mảng không sắp xếp, các hàm dò sẽ dò theo tuyến tính (linear search). Tức là dò từ đầu đến cuối, tới chỗ match thì dừng.
Đối với mảng sắp sếp, các hàm sẽ dò theo nhị phân (binary search).
Lookup có ba đặc tính sau đây:
1. nó là hàm mảng ngầm. Tức là nó tự biết triển khai các con toán mảng thành kết quả mảng.
2. nó luôn coi như mảng dò đã sắp xếp, tức là nó sẽ dò theo nhị phân.
3. nó sẽ bỏ qua các trị số error
Xảo thuật mà người ta lợi dụng là:
- Lookup(n, 1/...) dò tìm số n trong mảng tạo ra bởi con tính 1/...
- vì biểu thức (...) là biểu thức so sánh cho nên kết quả chỉ trả về {true, false, ...}. Nhưng ô thoả điều kiện trả về true, và nhưng ô không thoả thì trả về false.
- vì True/False có tính chất lượng nên Excel tự đặt luật để số lượng hoá True thành 1 và False thành 0 khi cần thiết phải làm toán số lượng. Như vậy, đem làm mẫu số cho con toán 1/... thì biểu thức sẽ tự số lượng hoá nó thành {1, 0,... } để có thể thực hiện phép chia.
- như vậy, biểu thức 1/{true, false, true, ...} sẽ thành { 1/1, 1/0, 1/1, ... }, và kế tiếp là { 1, error, 1, ... }
- Lookup sau đó sẽ cố tìm trị n trong mảng { 1, error, 1, ... }. Lưu ý là ở đây sẽ có người cho rằng không phải error, mà Lookup đã tự động biến error thành 0. Tôi không tranh cãi, bởi vì điều này không quan trọng, miễn nó không lớn hơn 1 là không ảnh hưởng đến phép dò nhị phân.
- Khi dò nhị phân một trị n trong mảng { ... }, phép dò sẽ dừng lại ở phần tử bên phải cùng và thoả điều kiện <= n. Lưu ý đây là tính chất dò nhị phân của MS chứ không nên kết luận do nó dò từ bên phải.
- trong mảng { 1, error, 1, ... } nếu n >= 1 thì phép dò sẽ dừng lại ở phần tử đầu tiên bên phải có trị là 1. Và đó chính là phần tử ở vị trí ô thoả các điều kiện ban đầu đặt ra.
Suy ra, theo lý thuyết, ở trường hợp của bạn thì Lookup(1, 1/...) hay Lookup(2, 1/...) đều như nhau. Cả 1 và 2 đều thoả điều kiện >=1