FILTER 関数の結果に対してさらに処理を加えたいときに、LAMBDA 関数での処理をするのに、MAP 関数が必要なことがあります。

たとえば、次のような売上一覧があるときに、売上が 300,000 円以上の人だけを抽出して、その結果は「さん」付けで表示したいとします。
FILTER 関数による処理の結果である 「石田」と「渡辺」という 2 つの結果に、「さんを付ける」という同じ処理をしたい、ということです。

こんなときには MAP 関数を使います。
ここでは、MAP 関数の基本的な使い方と FILTER 関数との組み合わせについてご紹介します。

LAMBDA 関数とパラメーター

MAP 関数をしるには LAMBDA 関数を知る必要があります。 
こちらで、LAMBDA 関数の基本について紹介しているので、必要ならご覧ください。

LAMBDA 関数は、「値 (パラメーター) 」と「パラメーターの値を使って行う処理 (計算) 」を指定して、処理を定義し、関数を作成します。
たとえば、「=LAMBDA(A , A*10)(5)」とすると、パラメーター (A) に 5 が渡されて、「50」が返ります。

パラメーターの数と渡す値の数は、一致している必要があり、「=LAMBDA(A,A*10)」のようにパラメーターが 1 つ (A) しかない LAMBDA 関数の処理に対して、「=LAMBDA(A,A*10)(A1,A2,A3)」のように 3 つのセルの値を渡すことはできません。
パラメーターが 1 つなら渡せる値 (セル) も 1 つ、3 つのセルの値を受け取りたいのなら、LAMBDA 関数の数式でも 3 つのパラメーターを定義する必要があります。

MAP 関数の構文

LAMBDA で、セルに入力されている複数の値を 1 つずつ順番に処理するために、MAP 関数が必要になります。
MAP 関数を使うと、セル範囲や配列に含まれる値を 1 つずつ LAMBDA 関数の 1 つのパラメーターに渡して、同じ処理を繰り返すことができます。

MAP 関数の構文は次の通りです。

=MAP(配列,LAMBDA(パラメーター , 処理 (計算) )

配列 処理の対象となるセル範囲や配列を指定する。
LAMBDA(パラメーター , 処理(計算) ) LAMBDA 関数による繰り返したい処理の定義を指定する。

たとえば、「=MAP({1;2;3},LAMBDA(A,A*10)) 」として、配列の値を 10 倍する数式で確認してみます。(★配列定数の中で値を縦方向に並べる場合は、{1;2;3} のように、値の区切りにセミコロン「;」を使います。)

配列 {1;2;3} から、最初に「1」、次に「2」、最後に「3」が 1 つずつ LAMBDA 関数の数式「LAMBDA(A,A*10) 」に渡されます。

「A」は、MAP 関数から渡された値を受け取る LAMBDA 関数のパラメーターです。
最初はAに「1」が入り、次に「2」、最後に「3」が入ります。そのため、内部では次のような計算が順番に行われています。

1×10
2×10
3×10 

よって、「=MAP({1;2;3},LAMBDA(A,A*10)) 」では、1、2、3という3つの値を、それぞれ 10 倍するため、実行結果として、下図のように、計算結果が縦方向に表示されます。

なお、配列定数では、区切り記号によって値を並べる方向が変わるため、配列の値をカンマで区切ると (「=MAP({1,2,3} , LAMBDA(A,A*10)) 」) 結果が横方向に表示されます。

セル範囲の値を順番に処理する

 MAP 関数には、配列にセル範囲を指定することもできます。
たとえば、セル A1 に「100」、セル A2 に「200」、セル A3 に「300」が格納されているとします。
各セルの値を 10 倍する場合は、「=MAP(A1:A3 , LAMBDA(A,A*10)) 」とすると、次のような結果が返ります。

ここでは、MAP 関数は、A1:A3 の値を 1 つずつ取り出して、LAMBDA 関数のパラメーター「A」に渡しているので、数式の中では、次のように処理が順番に行われています。

A に 100 を入れて、100×10
A に 200 を入れて、200×10
A に 300 を入れて、300×10

このように、MAP 関数を使うと、セル範囲に含まれるすべての値に同じ処理を行うことができます。

数式をコピーする場合との違い

セル A1 から A3 の値を 10 倍するだけであれば、通常は「=A1*10」という数式を作成して、セルを下方向にコピーする方法を使います。これが基本だし、一般的ですね。
この方法では、セルごとに数式が入力されます。今回の例だと、数式は 3 つ作ることになります。

一方、MAP 関数で処理する場合は、先頭のセルに作成した 1 つの数式「=MAP(A1:A1 , LAMBDA(A,A*10)) 」だけで、処理でき、スピルされてすべての計算結果が表示されます。そのため、処理するデータの件数が増減しても、数式をコピーし直す必要がありません。

単純な計算では通常のセル参照でも十分ですが、処理の内容が複雑になった場合や、ほかのスピルに対応した関数と組み合わせる場合は、MAP 関数を使うことで 1 つの数式で処理をまとめやすくなります。

FILTER関数で抽出した結果をMAP関数で処理する

MAP関数は、FILTER関数などのスピルに対応した関数と組み合わせて使用できます。

たとえば、次のような売上をまとめた一覧があるとします。

売上が 300,000 円以上の人だけを抽出する場合は、「=FILTER(A2:A5 , B2:B5>=300000) 」のような FILTER 関数を使用した数式を作成します。

こちらの抽出した名前の後ろに「さん」を付けたい場合は、FILTER 関数の結果を MAP 関数の配列として利用します。
これが今回やりたかったこと。 

FILTER 関数の数式を MAP 関数の配列として利用し、LAMBDA 関数で名前に「さん」を結合する数式に編集すると、
「=MAP(FILTER(A2:A5,B2:B5>=300000),LAMBDA(名前,名前&"さん")) 」のような数式となり、FILTER の結果 (スピルの範囲) に「さん」が付いた結果が返ります。

この数式では、まず FILTER 関数 (「FILTER(A2:A5,B2:B5>=300000) 」が、売上が300,000円以上の人の名前を抽出します。
そこで抽出された「石田」と「渡辺」が、MAP 関数によって 1 つずつ LAMBDA 関数の数式 (「LAMBDA(名前,名前&"さん")) 」に渡され、「名前」というパラメーターに、最初に「石田」、次に「渡辺」が入り、それぞれの名前に「さん」を追加した結果が、縦方向に表示されます。

MAP 関数を使うと、FILTER 関数で抽出した複数の値に対して、さらに同じ処理を加えることができる、ということです。


MAP 関数を使うと、セル範囲や配列の値を 1 つずつ LAMBDA 関数に渡して、同じ処理を繰り返すことができます。
基本の形 (構文) は、「=MAP(配列 , LAMBDA(パラメーター,計算)) 」です。
MAP 関数を使うことで、1 つの数式で複数の計算の結果を返すことができます。
また、FILTER 関数 (スピルに対応した関数) と組み合わせると、抽出した複数の値に対して、文字を追加したり、条件に応じた分岐処理を行ったりすることもできます。これが必要になることがあるはず。MAP 関数を知っておきましょう。

石田 かのこ