関数のデータ型について

※このページの内容は、配列研究室と併せてお読みいただくと、より理解が深まると思います。

Excelのワークシート関数を使いこなすうえでの基本的な概念であるにも関わらず、意外と理解していない人が多いのが、関数の引数および戻り値の「データ型」です。
ここでは、Excelの関数で、実際に操作の対象となっているのがどのようなデータなのかについて解説します。

「データ型」というと、数値or文字列、のように考えてしまう人も多いと思いますが、こうした違いであれば誰の目にも明白で、混乱したり問題が発生したりすることは少ないでしょう。
ポイントは、関数で処理される対象が、値または値の配列なのか、それともセル(範囲)の参照なのか、という点です。

関数の引数のデータ型

たとえば、SUM関数の引数として、セル範囲を指定することができます。同様に、RANK関数の第2引数「範囲」にもセル範囲が指定できます。これだけを見ると、一見、同じ種類のデータが引数として渡されているように思えます。

=SUM(B2:B6)
=RANK(B2,B2:B6)

しかし、SUM関数の場合は、セル参照の代わりに数値や配列を指定することもできます。つまり、VBA的な言い方をすると、バリアント型の引数で、配列でもセル参照でもどちらでも問題ないような引数の受け取り方をしています。これは、AVERAGEやMAX、MINなどの関数でも同様です。
一方、RANK関数の引数「範囲」では、セル範囲の参照以外を受け取ることはできません。VBAの知識がある人には、配列変数ではなく、RangeオブジェクトとしてFunctionに渡されている、という言い方がわかりやすいかもしれません。

この違いは、それぞれのセル範囲を配列に置き換えてみることで確認できます。数式の中のセル範囲を参照している部分を選択して、[F9]キーを押すと、そのセル範囲に入力されている値の配列定数に変換されます。
前述の数式を次のように変えると、SUM関数は問題ありませんが、RANK関数の場合はエラーメッセージが表示され、入力を確定することができません。

=SUM({5;10;3;2;9})
=RANK(B2,{5;10;3;2;9})

2008年7月1日現在、Excel 2007のヘルプの「RANK」の項目では、引数「範囲」の解説として「数値を含むセル範囲の参照または名前、または数値配列を指定します」とありますが、これは明らかに間違いです(当然、2003以前のヘルプも間違っています)。

PHONETIC関数やCELL関数の場合を考えると、対象のセルの「値」を処理するわけではなく、セルの属性であるふりがなや書式情報を求めているわけですから、引数が「配列」(値のセット)ではなく「セル参照」でなければならない理由がよくわかります(VBAの知識がある人は、同じ機能を持ったユーザー定義関数を作成することを考えてみてください)。
一方、RANK関数の第2引数やCOUNTIF・SUMIF関数の第1引数、SUBTOTAL関数の第2引数以降などは、別に配列でもいいような気がしますが、実際にはセル参照でなければなりません。このへんを理解しておかないと、複雑な数式を作成する際に、思い通りの結果が得られない原因となります。

反対に、LOOKUP、VLOOKUP、HLOOKUP、MATCH関数の「範囲」の引数などは、いかにもセル範囲の参照でなければならないように思えますが、実際には範囲の参照の代わりに配列を指定することもできます(こちらを参照)。

このページの先頭へ戻る

関数の戻り値のデータ型

戻り値としてセル参照を返す関数もあります。やはりVBA的な言い方をすると、FunctionプロシージャをAs Rangeで作成し、戻り値としてRangeオブジェクトをプロシージャ名にSetするようなタイプの関数です。
このタイプの関数は、基本的にはOFFSET、INDIRECT、INDEXの3つです。特にOFFSET関数は、セル参照を受け取って(引数「基準」の指定)、セル参照を返す関数といえます。INDEX関数については、引数・戻り値ともに配列とセル参照のどちらを扱うこともでき、引数がセル参照であればセル参照を、配列であれば値(または配列)を返します。
また、IF関数やCHOOSE関数などは、引数にセル参照を指定すると、条件次第でそのセル参照がそのまま返されます。Excel 2007で追加されたIFERROR関数は、これらと違ってセル参照は返さないので注意してください。

これらの関数の戻り値がそのまま数式の計算結果になっている場合、セルには、その参照先のセルの値が表示されます。つまり、セル上の表示を見ただけでは、その関数によって取得されているのがセル参照なのか、それともセルの値なのかは判別できません。
この点について、たとえばVLOOKUP関数と比較してみましょう。

=OFFSET(B1,3,0)
=VLOOKUP(3,A2:B6,2)

この場合、どちらの数式でも、B4セルの値である「江藤晴美」という名前が表示されるため、一見、同じような処理がされているように思えます。しかし、両者の違いは、この関数式をそのままPHONETIC関数の引数にした場合に明らかになります。

=PHONETIC(OFFSET(B1,3,0))
=PHONETIC(VLOOKUP(3,A2:B6,2))

OFFSET関数の場合は「エトウハルヨシ」というふりがなが表示されるのに対して、VLOOKUP関数の場合はエラーメッセージが表示され、入力を確定することができません。つまり、OFFSET関数がセル参照を返しているのに対して、VLOOKUP関数は該当する位置にあるセルの値だけを返しているのだと判断できます。
VLOOKUP関数の場合、「関数の引数のデータ型」でも説明したように、引数として与えられるのがセル範囲の参照でも値の配列でも、どちらにも対応できるような処理の仕方になっています。したがって、その戻り値はやはり値になります。

ここではOFFSET関数で基準のセルを指定していますが、VLOOKUP的に、1列目で検索して、発見された行のセルのふりがなを取り出したいという場合は、INDEX関数とMATCH関数を組み合わせるとよいでしょう。

=PHONETIC(INDEX(A2:B6,MATCH(5,A2:A6),2))

この例ではINDEX関数の第一引数にセル範囲全体を指定して、VLOOKUP関数のように列を番号で指定していますが、最初から「B2:B6」のように取り出す範囲を指定しても問題ありません(その場合は、INDEX関数の列番号の指定も、省略するか1にします)。

戻り値がセル参照なのか値なのかというのは、こうした例のように、セル参照を引数とする関数でその戻り値を使用できるかどうか、という状況で問題となります。こうした違いを理解して、必要に応じてそれぞれのタイプの関数を使い分けるようにしてください。

このページの先頭へ戻る