ただし使いどころはなかなか難しそうです。
- MAP関数を利用することにより、本来1つの選択範囲に対し1つの(集約した)結果しか返さない関数を、1つ1つのセルに対し個別に実行した結果を得ることができます。
手順
IF関数の例(わかりにくい)
まずは効果が分かりにくい例です。
マイクロソフトの公式解説にある例とほぼ同じですが、B2:D3の範囲に含まれる6つの数値について、5以上だったらそれを2乗した値を、5未満だったら値をそのまま返すというものです。
例1でMAP関数を用いて実現しており、その式(B6セル)は次のとおりです。
B6セル(例1)
=MAP(B2:D3,LAMBDA(a,IF(a>=5,a^2,a)))
B2:D3セルの範囲にaという名前をつけ、LAMBDA関数内で定義された「IF(a>=5,a^2,a)」により条件に応じた値を返す計算をしています。
ただ、IF関数はもともと引数で指定された範囲の個々のセルについて計算を行い個々の結果を返す(スピル)ので、MAP関数を使わずとも画像中の例2のように記せば同じ結果を得ることができます。
範囲に名前をつけるにしてもLET関数を使って例3のようにするのがシンプルでしょう。
よってこの最初の例では、MAP関数特有の効果が明らかでないように思われます。
CELL関数の例
続いて効果が明確な例です。
CELL関数の第1引数を「"address"」とすると、第2引数で指定した範囲のうち最も左上にあるセルのアドレス文字列を得ることができます(画像中例2)。
しかし例1のようにMAP関数を使えば、指定範囲のすべてのセルのアドレスを得ることができます。
B7セル(例1)
=MAP(B2:D4,LAMBDA(a,CELL("address",a)))
これにより「=CELL("address",B2)」「=CELL("address",C2)」といった式を9個それぞれ実行したのと同じ結果を得られています。
最初のIF関数の場合はもともと選択範囲に複数のセルが含まれていれば複数の結果を返すので効果が明確ではありませんでした。一方でCELL関数&addressの場合は選択範囲をいくら広げても1つしか値を返さなかったものが、MAP関数を使うことにより個々のセルに対する結果を得ることができています。
SUM関数の例
こちらも実用性はありませんが、最も一般的な関数であるSUM関数を使った例です。
例1でSUM関数とMAP関数を組み合わせていますが、得られた結果は選択範囲(B2:D3)と全く同じものです。
B6セル(例1)
=MAP(B2:D3,LAMBDA(a,SUM(a)))
SUM関数は複数の数値を「合計」という1つの値に集約する関数ですので、指定範囲の大きさによらず1つの結果しか返しません。
しかし例2のようにMAP関数を使うことで「選択範囲の個々のセルごとに合計を求める」ことになり、選択範囲の内容がそのまま返っています。
一方で例3のBYROW関数の場合は「選択範囲の行ごとに合計を求める」こととなるため2つの数値が返っています。これやBYCOL関数(列ごとの結果が得られる)と比べると、MAP関数の場合はいわば「BYCELL」のような効果が得られていることがわかります。
COUNTIF関数の例
最後にやや実用寄りの例です。
例1ではCOUNTIF関数とMAP関数を併用することで、指定範囲内の文字列が「山」の字を含んでいるかどうか個別に判定しています。
B6セル(例1)
=MAP(B2:C3,LAMBDA(a,IF(COUNTIF(a,"*山*"),"山を含む","山を含まない")))
Excelには文字列が特定の部分文字列を含むかどうか直接判定(True/False)する関数がないので、COUNTIFとワイルドカードを用いて結果が0でなければ「含む」ものと判断するのが常套手段です。
しかしCOUNTIF関数も結果を1つの数値に集約する関数ですので、例4のように「=COUNTIF(B2:C3,"*山*")」とすると、得られるのは「B2:C3の範囲にいくつ『山』の字を含むセルがあるか」という結果です。この結果にIF関数を加えた例3は「B2:C3の範囲に『山』の字を含むセルが1つ以上あるかどうか」を判定していることになります。
一方で例2のようにCOUNTIF関数にMAP関数を併用するとセルごとのカウント結果が得られます(せいぜい1にしかなりませんが)。これにより各セルが「山」を含んでいるかどうか個別に判定することができ、IF関数を加えることで例1のように個別の判定結果を表示することができます。
その他の例
次の記事の2番目の例でMAP関数を使用しています。ただしこの例ではBYROWでも済むはずです。