2015-09-21 9 views
6

私は何年もこのエクセルの公式を使ってきました。それは正常に動作しますが、私はそれが動作する理由を理解したい!式は、の最後のがリストに関連付けられた値を見つけるために使用されます。例えば:ルックアップの神秘的な使用

Macro usage example.

C14中の式:ここ=LOOKUP(2,1/(B1:B12="meat"),C1:C12)

C14における式は、最新"meat"標識された細胞の列Bに見えるとC列に関連付けられた値を返します。 "meat"B9であり、これに対応してC9の値を返します。

数式の中で最も不思議な部分は"1/(....)"です。この部門は何ですか?この構文はどこから来ますか?他の場所で使うことはできますか?参照値が2の理由

答えて

8

はここで何が起こっているのかです:この

=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 

これは答えです。求められた値が他のすべての値よりも高い場合、バイナリ検索は常に最後の値を返します。

+0

あなたは 'B1:B1 =" meat "'に 'B1:B12'を意味します。 – ManishChristian

+1

偉大な答え!だからそれはハックです!私は想像したことがありません。今私には明らかです。ありがとうございました。 –

+0

タイプミスを修正しました。ありがとうNelly27281。 –

4

ロジックは次のように進む:

  • B1:B12="meat"は、ブール値のアレイ、さもなければ
  • 1/trueを返し1ここで、 "肉" TRUEおよびFALSEを返し、1/FALSE = 1/0戻り位一方DIV/0!のように、配列は1と#DIV/0! 'で満たされます。 (このステップは次のステップで使用するために、誤差値にFALSE変換するために使用されていない。)

enter image description here

  • は失敗し、その配列に値2のルックアップを行って、何があるため2、および値がソートされていないためです。その代わりに、LOOKUPは、#DIV/0を無視して、2より小さい数値の最後のオカレンスを探します。エラー値。どうして?知るか。 documentation for the LOOKUP function

本質的に、このフェナニガンは本質的に、文書化されていない動作に依存して所望の結果を返すものです。

+0

MATCH関数のドキュメントをチェックしてください:https://support.office.com/en-GB/article/MATCH-function-e8dffd45-c762-47d6-bf89-533f4a37673aソート方法についての説明が良い – Seb

+0

@ Seb:それで、私はそれを見ましたが、私はあなたの意見を見ません。 –

関連する問題