Excel:MAP関数の使用例

Microsoft 365でExcelに追加されたMAP関数を使ってみたのでいくつか使用例を紹介したいと思います。

MAP関数とは

配列や範囲のそれぞれの値についてLAMBDA関数を適用した新しい配列を作成することができる関数です。

MAP関数のイメージ

MAP 関数の定義は以下になります。

MAP(配列, [配列, ... ,] ラムダ関数)
引数説明
配列変換する元となる配列や範囲を指定します。配列は複数指定が可能です。
ラムダ関数配列や範囲の値を変換するLAMBDA関数を指定します。LAMBDA関数は指定された配列の数と同じ数の引数を取ります。

配列を1つ指定する場合のMAP関数の例は以下です。

=MAP(配列, LAMBDA(x, 値を返す数式))

配列を2つ指定する場合は以下のようにLAMBDA関数の引数が2つになります。

=MAP(配列1, 配列2, LAMBDA(x, y, 値を返す数式))

このようにLAMBDA関数の引数の数は指定した配列の数と同じになります。

一番簡単な使用例

まずMAP関数の一番簡単な使用例を見ていきます。

MAP関数の一番簡単な使用例
1=MAP(A3:A6,LAMBDA(x,2*x))
2
3
4

MAP関数の1つ目の引数に「A3:A6」の範囲を指定、2つ目の引数には2倍した値を返すLAMBDA関数を指定しています。MAP関数から「A3:A6」の範囲のそれぞれの値を2倍した値の配列が返されます。結果は以下のようにスピル機能によって「C3:C6」の範囲に表示されます。

一番簡単な使用例
12
24
36
48

複数の配列を指定する使用例

次は複数の配列を指定する使用例を紹介します。

以下の例は勤務表で「退勤時間 - 出勤時間 - 休憩時間」がその日の勤務時間になります。それぞれの日付の勤務時間の合計をMAP関数で求めたいと思います。

MAP関数の引数に出勤時間の列の範囲「B3:B7」、退勤時間の列の範囲「C3:C7」、休憩時間の列の範囲「D3:D7」と最後の引数に勤務時間を計算するLAMBDA関数を指定しています。

複数の配列を指定する使用例
日付出勤時間退勤時間休憩時間
2月1日9:0017:001:00
2月2日9:0017:301:00
2月3日9:0014:000:30
2月4日9:0017:001:00
2月5日9:0018:001:00
合計時間
=SUM(MAP(B3:B7,C3:C7,D3:D7,LAMBDA(出勤,退勤,休憩,退勤-出勤-休憩)))

各行ごとにLAMBDA関数の引数の出勤、退勤、休憩に渡され勤務時間が計算されます。そしてMAP関数によって計算された勤務時間の配列の合計をにSUM関数で求めています。

結果は以下のようになります。(MAP関数を入力したセル「A10」の書式は「[h]:mm」としています。)

複数の配列を指定する使用例の結果(A10)
日付出勤時間退勤時間休憩時間
2月1日9:0017:001:00
2月2日9:0017:301:00
2月3日9:0014:000:30
2月4日9:0017:001:00
2月5日9:0018:001:00
合計時間
34:00

動的配列数式を使用した以下の数式でも同じ結果になります。

=SUM(C3:C7-B3:B7-D3:D7)

複数の列の値の組み合わせで行を特定して値を取得する使用例

最後に複数の列の値の組み合わせで行を特定して値を取得する使用例を紹介します。

以下の例は伝票の明細のデータで伝票Noと明細Noで一意となります。このデータから伝票Noと明細Noで行を特定して商品コードを取得したいとします。

複数の列の値の組み合わせで行を特定して値を取得する使用例
伝票No明細No商品コード単価数量
220201000010001A000130010
220201000010002A000221012
220201000020001A00031909
220202000010001A00013005
220210000010001A000130020
220210000010002A000221012
220210000010003A00031905
220210000020001A00013002
伝票No22021000001
明細No0002
商品コード=FILTER(C3:C10,MAP(A3:A10,B3:B10,LAMBDA(x,y,AND(x=B12,y=B13))))

伝票Noと明細Noを結合した作業用の列を作成してVLOOKUP関数で取得することもできますがMAP関数とFILTER関数を組み合わせた数式を使用して取得しました。

結果は以下になります。

複数の列の値の組み合わせで行を特定して値を取得する使用例の結果(セルB14)
伝票No明細No商品コード単価数量
220201000010001A000130010
220201000010002A000221012
220201000020001A00031909
220202000010001A00013005
220210000010001A000130020
220210000010002A000221012
220210000010003A00031905
220210000020001A00013002
伝票No22021000001
明細No0002
商品コードA0002

このように複数の条件で行を検索する場合でもFILTER関数とMAP関数を組合せることで作業用の列を作成する必要がなくなりました。

動的配列数式とXLOOKUP関数を使用した以下の数式でも同じ結果になります。

=XLOOKUP(B12&B13,A3:A10&B3:B10,C3:C10)

また「FILTER 関数 - Office サポート」にMAP関数を使用せずにFILTER関数で複数条件の検索を行う方法が記載してあります。

ただ今回の例の場合はMAP関数を使用した方が分かりやすい数式になると思います。

まとめ

MAP関数を使用することでシートに作業用の表を作成したり表に作業用の列を作成したりすることなく数式の中で配列や範囲のデータを加工して使用することができます。

LAMBDA関数と組合せて使用する関数なのでLAMBDA関数の工夫次第でさらにエクセルが便利になりそうです。