2010年08月06日

INDEX関数の引数

ヘルプの解説のわかりにくさにおいては、INDEX関数もなかなかのものです。

実はExcel 2010になって、このヘルプ記事の記述が、それ以前とは微妙に変わった部分があります。(体裁とか、結構大きく変わってはいるのですが、1つのポイントとして)
それは、

INDEX(配列,行番号,列番号)

という関数の書式(これは配列形式ですがセル範囲形式でも同様)において、2007までは「行番号」「列番号」のいずれも省略可能とされていたのが、2010では「行番号」は必須で「列番号」は省略可能、という書き方になっていることです。

ただ、そうはいっても2010の解説の中では以前と同様、

配列が 1 行または 1 列のみの場合、それぞれ行番号または列番号を省略することができます。

といった感じで、あたかも行番号が省略できるような表現もされています。

「列番号を省略する」のはわかりますが、この関数で「行番号を省略する」というのは、具体的にはどういう書き方になるのでしょうか?
ちょっと考えると、

=INDEX(A1:C1,,2)

のようなことかな、と思ってしまうのですが、ここで書いたように、実はこの書き方では第二引数を省略したことにはならず、0を指定したと見なされます。
行番号または列番号に0を指定すると、対象が複数行×複数列の配列(セル範囲)であれば、もう一方の引数で指定した列全体または行全体の配列(セル範囲)を返します。
上の例の場合、対象の配列(セル範囲)は1行だけなので、「全体」を取り出しても戻ってくる値は1つだけ。
結果として1つのセルの値だけが取り出せるので、ひょっとしてこの書き方で正解なのかとも思ってしまうのですが……。

「行番号を省略する」というのは、正しくは次のような書き方です。

=INDEX(A1:E1,2)

しかしこれでは「省略されているのは列番号では?」と思ってしまいますよね。
試してみるとわかりますが、これでちゃんと2列目のセル(この場合はB1)の値が戻ります。

「行番号」という名前が付いているため混乱してしまうのですが、このようなケースでは、第二引数で指定される番号の方向は必ずしも「行」とは限らず、配列(範囲)の形に従います。
要するに、対象が一次元配列(方向は問わず)のとき、第二引数では、その配列内での位置を表す番号を指定しているということです。
正直に白状すると、私自身、結構長い間、このあたりのことが理解できていませんでした。

内容的に行番号なのか列番号なのかはさておき、とりあえずINDEX関数の第二引数は省略不可であり、その引数にたまたま「行番号」という名前が付けられている、というわけです。
INDEX関数の仕様自体が変わったわけではありませんが、ヘルプの書式はこのあたりのことを苦慮したうえでの変更だったのでしょう。


ところでINDEX関数のヘルプといえば、「配列形式」と「セル範囲形式」という表現もわかりづらいですね。
「配列形式」のほうが先に説明され、「セル範囲形式」の書式では第四引数「領域番号」についての説明もあるため、一見、後者のほうが特殊な形式なのかとも思ってしまいます。

実際には、第一引数がセル範囲の参照なら「セル範囲形式」となり、配列なら「配列形式」になります。
何が違うのかというと、前者が戻り値としてセル参照を返すの対し、後者は値(または一次元配列)を返す点です。
(戻り値が値とセル参照とではどう異なるのかについてはこちらを参照)

ヘルプをよく読めばちゃんとそう書いてあるのですが、配列形式の使用例として載っているのがセル範囲を参照する例だったり……(^^;)

ともあれ、INDEXの実際の用途としては、「セル範囲形式」で使われているケースのほうが一般的かと思われます。
決して「第四引数を指定した場合はセル範囲形式、そうでなければ配列形式」というわけではないので、誤解なきよう。
(しかし、こういう勘違いをしている人も結構いそうな気がします。……私も以前そうだったので^^;)
posted by 土屋和人 at 07:58| Comment(5) | TrackBack(0) | Excel
この記事へのコメント
こんばんわ!
Amazonで土屋和人先生の存在を知り
ブログへ参りました。

私はアフィリエイターで、
無料ブログに自分の作った文章を投稿させようと思っています。

そこでVBAを使ってみようと思うのですが、土屋和人先生のどの書籍を購入すれば、上記のようなことはできるようになりますでしょうか?


ご教授願います!


Posted by 宮 at 2010年09月07日 23:11
宮さん、コメントありがとうございます。

VBAで具体的にどのようなことをなさりたいのか、今一つよくわからないのですが(失礼ですが、コメントスパムのようなことではないですよね?)、単にWebページ上のフォームをVBAから操作する方法でしたら、右に出ている「Excel VBA WEB連携術」にもいくらか書いてあります。

ただ、そこに書かれていること以上の応用をしたいと思ったら、VBAの基本的な知識もある程度必要になりますが、そうした意味ではこの本はそれほど詳しくありません。
あと、ブログの仕様にもよるでしょうが、記事を投稿するとなると、認証とかいろいろと面倒なハードルがありそうな気もします。
Posted by 土屋和人 at 2010年09月08日 10:04
おはようございます。
宮です。

説明不足で大変失礼いたしました。
私はアフィリエイトでVBAで自動化を目指していまして、
エクセルに書き溜めた記事を1行ずつ、
FC2やjugem、livedoor、seesaaaといったメジャーなブログサービスに自動投稿するシステムをと考えております。

あれから調べていましたら、
Document.Formsを使ってネット上の
フォームにデータをセット(書き込む)
ということまで調べました。

このような知識も
「Excel VBA WEB連携術」には書かれておりますでしょうか?

お忙しいところ恐縮ですがよろしくお願いします。





Posted by 宮 at 2010年09月08日 10:34
うーん……載ってるのは、Webページ上の特定の入力ボックスにテキストを入力して、特定のボタンをクリックするという1つのケースだけですから、正直、あまり応用は利かないと思います。

VBAでIEを操作とか、そのあたりのキーワードでネットを探されたほうが、いろいろと有効な情報が見つかるのではないでしょうか。
Posted by 土屋和人 at 2010年09月08日 21:57
この記事に全く同意です。
INDEX関数のややこしさがEXCEL関数の理解の障壁になっていると言っても過言ではないぐらいです。

INDEX関数を無理矢理万能にさせすぎているため、(ユーザーにとっては利点も多いですが)ヘルプが煩雑になり、かたや世間では、アクロバティックな使い方ばかり目にするため理解に時間がかかり挫折する人も多いのではないでしょうか?

書式だけでは使いこなせないINDEX関数の細部の仕様を追求することで初めて、
「データ型」というEXCEL全体の仕様に辿り着き「セル参照を返す」について真の理解を得ることができます。
そういうことを自分で見つけ出さなければならないというEXCELのユーザビリティにこそに問題があるんだと思います。

INDEXを卒業したらSUMPRODUCTが次の障壁ですよね、できましたら、これも親切な解説をよろしくお願いします。
Posted by bonac at 2017年11月16日 09:21
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40005453
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック