カスタムLOOKUP

ここでは珍しく、Excelの話。

超便利な VLOOKUP 関数ですが、検索値が左端になくてはならなかったりと、柔軟さに欠ける所もあります。

ワークシート関数だと、INDEX と MATCH を組み合わせた方法がありますが、VBA(xslm ファイル)を使える環境用に、それっぽいユーザ定義関数を作ってみました。

関数名は、CrossLookUpです。

CrossLookUp(検索値, 参照セル, 検索方向, オフセット数)

機能としては、VLOOKUP 関数と HLOOKUP 関数を合体させたような感じ。キーは、端の行(列)になくても構いません。

引数は以下の通り。全て必須(Optional 無し)。

  • 検索値:調べたい範囲に存在する事を期待する値、もしくは、値が入ったセルの参照
  • 参照セル:検索値が存在する事を期待する、列もしくは行
  • 検索方向:検索したい方向。垂直か水平(VLOOKUP と HLOOKUP に相当)
  • オフセット数:垂直探索の場合、左または右、水平探索の場合、上または下のセルに対してオフセットする

戻り値は、オフセット先のセルです。

ポイントは、検索値が、検索対象範囲のどこにあっても良いという所と、範囲(VLOOKUP の table_array)を指定しなくて構わない所ですね。

たとえば、次のような表があって(画像ですみません。左上端は A1 セルです)、

f:id:ublftbo:20170712002425p:plain

特のりタル弁当を探したいとします(メニューデータは、ほっともっと のページを参照しました⇒お弁当)。

VLOOKUP だと、カロリーまで出したければ、(B2:D13)を検索範囲に設定しなくてはなりません(構造化参照などを使わない場合)。

CrossLookUp では、参照は、B 列の値が入っているセルのどこでも選択して構いません(B1 でも B12 でも)。1 つ選択すれば、動的に範囲を取得します。

検索方向は、文字列で指定。英語の垂直水平の頭文字ですね。直感的にやりやすいようにしました。

オフセットは、検索範囲の列もしくは行を基準(ゼロ)にして、正負どちらでも指定出来ます。オフセットで取りに行きます。オフセットは、検索範囲に交差する方向です。

各種例外処理を入れてあります。

検索は、完全一致のみです。

たとえば、こんな感じですね↓ f:id:ublftbo:20170712003859p:plain

数式↓

f:id:ublftbo:20170712003858p:plain

細かい流れは、コード中にコメントで記しています。以下に掲載します。

VBA

時間をかけてテストしていないので、不具合があるかも知れません。

色々ごちゃごちゃやっているので、パフォーマンスもよろしく無いでしょうね。

ここはこうしたほうが良いのでは、とか、間違ってるんじゃ? みたいな所があれば、ご指導頂ければありがたいです。

参考にしたページ

support.office.com

Excel のパフォーマンスの問題を最適化するヒント

Office TANAKA - Excel VBA高速化テクニック[セルを配列に入れる]

メモ:鈴木眞一の見解について

簡単に。これまでの鈴木氏の意見から、このように認識しているであろう、という推察。

  • 鈴木氏は、ウェルチらの言う所の過剰診断の割合は小さいであろうと認識していると思われる
  • それは、過剰診断が無いという事を意味しない
  • 鈴木氏が言っているのは、症状が発現するものを先取りして発見している割合が大きい、という事だと思われる
  • 鈴木氏は、overdiagnosis と overtreatment を混同している可能性がある。後者ならば前者だが、逆は必ずしも真では無い。従って、手術のし過ぎでは無いと主張したい場合、過剰診断では無いと表現するのは、正確とは言えない。
  • 韓国等の事例と比較しているのは、日本におけるがんの経過観察の知見を適用しているので、overtreatment が多いとは言えない、との主張であろう。
  • 鈴木氏は、甲状腺がん流行しているとは言っていない。2014年に、発見に地域差が認められない事や、ラテントがんの知見などから、当時のデータからは、放射線の影響で甲状腺がんが発生しているとは考えにくい、と述べている。参考: 福島県での甲状腺がん検査結果の現状(鈴木眞一氏)|エネ百科|きみと未来と。

併せると、鈴木氏が主張しているのは、

  • 流行は起こっているとは言えない(少なくとも当時のデータからは)
  • 過剰診断はそれほど多くは無い
  • 先取りの割合が大きい

というものだと考えられ、これら主張は整合する。

重要な補足として挙げておく。

過剰診断が少ない事は、検診が有効である事を意味しない

検診が有効であるというのは、検診に延命効果がある事が前提であり、過剰診断が少ない事は十分条件では無い。従って、過剰診断が少ないと主張する専門家があり、また、その主張が妥当であると想定しても、そこから、検診に効果があるという結論は導けない。