はここで何が起こっているのかです:この
=LOOKUP(2,1/(B1:B12="meat"),C1:C12)
はB1:B12="meat"
部分がTRUEとFALSE値の配列として評価され、この
=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)
なり、この
=LOOKUP(2,1/{TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE},C1:C12)
になります。 TRUEまたはFALSEで数式を計算すると、1または0になります.1を1または0で割ると、すべての真理値に対して1が、すべての偽りに対してdiv/0が返されます。
ちょうど2つのもの(1またはdiv/0のいずれか)で配列されていることがわかったので、1より大きい任意の数を調べることができ、最後の1を返しますリスト。あなたは=LOOKUP(800,...)
であり、それでも "ルックアップ値以下の最大値"を返します。
したがって、2つは多少恣意的です - それは1より大きい数値です。その要点は、1とエラーだけを含む検索配列引数を作成することです.LOOKUPはエラーを無視します。
バイナリ検索
私はこの上の公式ドキュメントを持っていないので、ここで非公式バージョンです。 LOOKUP、HLOOKUP、およびVLOOKUPには、データがソートされているかどうかを関数に指示する引数があります。その引数がFalseの場合、関数はすべてのエントリを最後まで探します。その引数がTrueまたは省略されている場合、この関数はバイナリ検索を使用します。バイナリ検索は一度に1つの検索よりも速いので、引数は存在するだけです。
バイナリ検索は、中間の値を見つけ出し、求められた値と比較して評価します。中間の値が大きい場合は、すべての値が破棄されます。必要な値は左側にある必要があります。それは左半分をとり、その中間価値を見つけます。それが大きければ、それは権利を捨て、左を保持します。あなたが値を見つけるまで繰り返し続けてください。
なぜLOOKUP(2,{1,1,#DIV/0!,1,1,#DIV/0!,1,1},...)
は、1
の代わりに1
という文字列がありますか?私は、MSがバイナリ検索をどのように実装したかを正確には知らないので、いくつか前提をしなければなりません。私の前提は、エラー値が配列からスローされ、偶数の項目(中間値なし)があるときは、中央の左側の値が使用されるということです。これらの仮定は間違っているかもしれないが、結果には全く影響しない。
まず、エラーをスローします。これらのエントリとその元の位置が今すぐにあります。
1 1 1 1 1 1
1 2 4 5 7 8
「中」の数字は1(4)です。それは2より小さい(価値がある)ので、我々はすべてのものを左に投げ捨てて、権利を再処理する。現在はあります
1 1 1
5 7 8
中間値は1(7)です。それは2よりも小さいので、すべてのものを左に投げ捨て、右に再処理します。今持っている
1
8
これは答えです。求められた値が他のすべての値よりも高い場合、バイナリ検索は常に最後の値を返します。
あなたは 'B1:B1 =" meat "'に 'B1:B12'を意味します。 – ManishChristian
偉大な答え!だからそれはハックです!私は想像したことがありません。今私には明らかです。ありがとうございました。 –
タイプミスを修正しました。ありがとうNelly27281。 –