2015-09-21 18 views
6

Tôi đã sử dụng công thức Excel này trong nhiều năm. Nó hoạt động tốt, nhưng tôi muốn hiểu tại sao nó hoạt động! Công thức được sử dụng để tìm giá trị được kết hợp được kết hợp trên danh sách. Ví dụ:Sử dụng bí ẩn LOOKUP

Macro usage example.

Formula trong C14: =LOOKUP(2,1/(B1:B12="meat"),C1:C12)

Ở đây, công thức trong C14 trông ở cột B cho mới nhất "meat" di động dán nhãn và trả về giá trị liên quan trong cột C. Nó tìm thấy "meat" tại B9 và tương ứng trả về giá trị tại C9.

Phần khó hiểu nhất của công thức là "1/(....)". Phân chia này là gì? Cú pháp này xuất phát từ đâu? Nó có thể được sử dụng ở nơi khác? Tại sao giá trị tra cứu là 2?

Trả lời

8

Đây là những gì đang xảy ra: Đây

=LOOKUP(2,1/(B1:B12="meat"),C1:C12) 

trở này

=LOOKUP(2,1/{TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE},C1:C12) 

mà trở thành này

=LOOKUP(2,{1;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;1;#DIV/0!;#DIV/0!;#DIV/0!},C1:C12) 

Phần B1:B12="meat" được đánh giá là một mảng các giá trị TRUE và FALSE. Khi bạn làm toán trên TRUE hoặc FALSE nó biến thành 1 hoặc 0. Chia 1 cho 1 hoặc 0 trả về 1 cho tất cả các giá trị và div/0 cho tất cả các falses.

Bây giờ bạn biết rằng bạn sẽ có một mảng đầy đủ chính xác hai thứ (hoặc 1 hoặc div/0), bạn có thể LOOKUP bất kỳ số nào lớn hơn 1 và nó sẽ trả về số cuối cùng trong danh sách. Bạn có thể =LOOKUP(800,...) và nó vẫn sẽ trả về "giá trị lớn nhất nhỏ hơn hoặc bằng giá trị tra cứu" hoặc trong trường hợp của bạn 1.

Vì vậy, hai phần là tùy ý - đó chỉ là một số lớn hơn 1. Điểm mấu chốt của nó là tạo đối số mảng tra cứu chỉ bao gồm 1s và lỗi - hàm LOOKUP bỏ qua các lỗi.

Binary Search

tôi không có tài liệu chính thức về vấn đề này, vì vậy đây là phiên bản không chính thức. LOOKUP, HLOOKUP và VLOOKUP có một đối số trong đó bạn cho biết hàm nếu dữ liệu được sắp xếp. Nếu đối số đó là False, hàm sẽ xem xét mọi mục nhập cho đến cuối. Nếu đối số đó là True hoặc bị bỏ qua, hàm sử dụng tìm kiếm nhị phân. Nó làm điều đó - đối số chỉ tồn tại - bởi vì tìm kiếm nhị phân nhanh hơn so với tìm kiếm một lần tại một thời điểm.

Tìm kiếm nhị phân hoạt động bằng cách tìm giá trị giữa và đánh giá nó dựa trên giá trị tìm kiếm. Nếu giá trị trung bình lớn hơn, mọi thứ ở bên phải sẽ bị loại bỏ - giá trị tìm kiếm phải ở bên trái. Phải mất nửa trái và thấy giá trị trung bình của điều đó. Nếu nó lớn hơn, nó sẽ loại bỏ bên phải và giữ bên trái. Tiếp tục lặp lại cho đến khi bạn tìm thấy giá trị.

Vậy tại sao LOOKUP(2,{1,1,#DIV/0!,1,1,#DIV/0!,1,1},...) tìm số 1 cuối cùng thay vì một số tùy ý 1? Tôi không biết chính xác làm thế nào MS thực hiện tìm kiếm nhị phân của họ, vì vậy tôi phải thực hiện một số giả định.Giả định của tôi là các giá trị lỗi được ném ra khỏi mảng và rằng khi có số lượng mục nhập đồng đều (không có giá trị giữa), giá trị ở bên trái giữa được sử dụng. Những giả định đó có thể sai, nhưng chúng không ảnh hưởng đến kết quả.

Trước tiên, hãy phát hiện lỗi. Bây giờ bạn có các mục nhập này và vị trí ban đầu của chúng

1 1 1 1 1 1 
1 2 4 5 7 8 

Số "trung bình" là 1 (4). Nó nhỏ hơn 2 (giá trị tìm kiếm), vì vậy chúng tôi ném mọi thứ sang bên trái và xử lý lại quyền. Bây giờ chúng tôi có

1 1 1 
5 7 8 

Giá trị trung bình là 1 (7). Nó nhỏ hơn 2, vì vậy chúng tôi ném tất cả mọi thứ sang bên trái và xử lý lại quyền. Bây giờ chúng tôi có

1 
8 

Chúng tôi chỉ có một mục nhập, vì vậy đó là câu trả lời. Nếu giá trị tìm kiếm cao hơn tất cả các giá trị khác, tìm kiếm nhị phân sẽ luôn trả về giá trị cuối cùng.

+0

nghĩa là 'B1: B12' trong' B1: B1 = "thịt" '. – ManishChristian

+1

Câu trả lời hay! Vì vậy, nó là một hack! Tôi chưa bao giờ tưởng tượng. Nó rõ ràng với tôi bây giờ. Cảm ơn bạn. –

+0

Sửa lỗi đánh máy. Cảm ơn Nelly27281. –

4

Logic đi như thế này:

  • B1:B12="meat" trả về một mảng các phép toán, TRUE nơi "thịt" và FALSE khác
  • 1/lợi nhuận TRUE 1, trong khi 1/FALSE = 1/0 lợi nhuận # DIV/0 !, vì vậy bạn sẽ nhận được một mảng chứa đầy 1 và # DIV/0! Như được minh họa bên dưới. (Bước này được sử dụng để chuyển đổi FALSE thành một giá trị lỗi, để sử dụng trong các bước tiếp theo.)

enter image description here

  • Làm một LOOKUP cho giá trị 2 trong mảng thất bại, vì không có 2 ở đó và bởi vì các giá trị không được phân loại. Vì vậy, thay vào đó, LOOKUP tìm kiếm sự xuất hiện cuối cùng của một giá trị bằng số nhỏ hơn 2, bỏ qua bất kỳ # DIV/0 nào! giá trị lỗi. Tại sao? Ai biết. Đây là một tính năng không có giấy tờ, không được đề cập trong số documentation for the LOOKUP function

Vì vậy, về cơ bản, shenanigan này dựa vào hành vi không có giấy tờ để trả lại kết quả mong muốn.

+0

kiểm tra trong tài liệu của hàm MATCH: https://support.office.com/en-GB/article/MATCH-function-e8dffd45-c762-47d6-bf89-533f4a37673a Giải thích về cách sắp xếp mọi thứ tốt hơn – Seb

+0

@ Seb: Ok, tôi đã nhìn vào nó, nhưng tôi không thấy quan điểm của bạn. –