Excel:MAP関数の使用例
Microsoft 365でExcelに追加されたMAP関数を使ってみたのでいくつか使用例を紹介したいと思います。
MAP関数とは
配列や範囲のそれぞれの値についてLAMBDA関数を適用した新しい配列を作成することができる関数です。
MAP 関数の定義は以下になります。
MAP(配列, [配列, ... ,] ラムダ関数)
引数 | 説明 |
---|---|
配列 | 変換する元となる配列や範囲を指定します。配列は複数指定が可能です。 |
ラムダ関数 | 配列や範囲の値を変換するLAMBDA関数を指定します。LAMBDA関数は指定された配列の数と同じ数の引数を取ります。 |
配列を1つ指定する場合のMAP関数の例は以下です。
=MAP(配列, LAMBDA(x, 値を返す数式))
配列を2つ指定する場合は以下のようにLAMBDA関数の引数が2つになります。
=MAP(配列1, 配列2, LAMBDA(x, y, 値を返す数式))
このようにLAMBDA関数の引数の数は指定した配列の数と同じになります。
一番簡単な使用例
まず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」の範囲に表示されます。
値 | |||||
---|---|---|---|---|---|
1 | 2 | ||||
2 | 4 | ||||
3 | 6 | ||||
4 | 8 | ||||
複数の配列を指定する使用例
次は複数の配列を指定する使用例を紹介します。
以下の例は勤務表で「退勤時間 - 出勤時間 - 休憩時間」がその日の勤務時間になります。それぞれの日付の勤務時間の合計をMAP関数で求めたいと思います。
MAP関数の引数に出勤時間の列の範囲「B3:B7」、退勤時間の列の範囲「C3:C7」、休憩時間の列の範囲「D3:D7」と最後の引数に勤務時間を計算するLAMBDA関数を指定しています。
日付 | 出勤時間 | 退勤時間 | 休憩時間 | |||
---|---|---|---|---|---|---|
2月1日 | 9:00 | 17:00 | 1:00 | |||
2月2日 | 9:00 | 17:30 | 1:00 | |||
2月3日 | 9:00 | 14:00 | 0:30 | |||
2月4日 | 9:00 | 17:00 | 1:00 | |||
2月5日 | 9:00 | 18:00 | 1:00 | |||
合計時間 | ||||||
=SUM(MAP(B3:B7,C3:C7,D3:D7,LAMBDA(出勤,退勤,休憩,退勤-出勤-休憩))) | ||||||
各行ごとにLAMBDA関数の引数の出勤、退勤、休憩に渡され勤務時間が計算されます。そしてMAP関数によって計算された勤務時間の配列の合計をにSUM関数で求めています。
結果は以下のようになります。(MAP関数を入力したセル「A10」の書式は「[h]:mm」としています。)
日付 | 出勤時間 | 退勤時間 | 休憩時間 | |||
---|---|---|---|---|---|---|
2月1日 | 9:00 | 17:00 | 1:00 | |||
2月2日 | 9:00 | 17:30 | 1:00 | |||
2月3日 | 9:00 | 14:00 | 0:30 | |||
2月4日 | 9:00 | 17:00 | 1:00 | |||
2月5日 | 9:00 | 18:00 | 1:00 | |||
合計時間 | ||||||
34:00 | ||||||
動的配列数式を使用した以下の数式でも同じ結果になります。
=SUM(C3:C7-B3:B7-D3:D7)
複数の列の値の組み合わせで行を特定して値を取得する使用例
最後に複数の列の値の組み合わせで行を特定して値を取得する使用例を紹介します。
以下の例は伝票の明細のデータで伝票Noと明細Noで一意となります。このデータから伝票Noと明細Noで行を特定して商品コードを取得したいとします。
伝票No | 明細No | 商品コード | 単価 | 数量 | |||
---|---|---|---|---|---|---|---|
22020100001 | 0001 | A0001 | 300 | 10 | |||
22020100001 | 0002 | A0002 | 210 | 12 | |||
22020100002 | 0001 | A0003 | 190 | 9 | |||
22020200001 | 0001 | A0001 | 300 | 5 | |||
22021000001 | 0001 | A0001 | 300 | 20 | |||
22021000001 | 0002 | A0002 | 210 | 12 | |||
22021000001 | 0003 | A0003 | 190 | 5 | |||
22021000002 | 0001 | A0001 | 300 | 2 | |||
伝票No | 22021000001 | ||||||
明細No | 0002 | ||||||
商品コード | =FILTER(C3:C10,MAP(A3:A10,B3:B10,LAMBDA(x,y,AND(x=B12,y=B13)))) | ||||||
伝票Noと明細Noを結合した作業用の列を作成してVLOOKUP関数で取得することもできますがMAP関数とFILTER関数を組み合わせた数式を使用して取得しました。
結果は以下になります。
伝票No | 明細No | 商品コード | 単価 | 数量 | |||
---|---|---|---|---|---|---|---|
22020100001 | 0001 | A0001 | 300 | 10 | |||
22020100001 | 0002 | A0002 | 210 | 12 | |||
22020100002 | 0001 | A0003 | 190 | 9 | |||
22020200001 | 0001 | A0001 | 300 | 5 | |||
22021000001 | 0001 | A0001 | 300 | 20 | |||
22021000001 | 0002 | A0002 | 210 | 12 | |||
22021000001 | 0003 | A0003 | 190 | 5 | |||
22021000002 | 0001 | A0001 | 300 | 2 | |||
伝票No | 22021000001 | ||||||
明細No | 0002 | ||||||
商品コード | A0002 | ||||||
このように複数の条件で行を検索する場合でもFILTER関数とMAP関数を組合せることで作業用の列を作成する必要がなくなりました。
動的配列数式とXLOOKUP関数を使用した以下の数式でも同じ結果になります。
=XLOOKUP(B12&B13,A3:A10&B3:B10,C3:C10)
また「FILTER 関数 - Office サポート」にMAP関数を使用せずにFILTER関数で複数条件の検索を行う方法が記載してあります。
ただ今回の例の場合はMAP関数を使用した方が分かりやすい数式になると思います。
まとめ
MAP関数を使用することでシートに作業用の表を作成したり表に作業用の列を作成したりすることなく数式の中で配列や範囲のデータを加工して使用することができます。
LAMBDA関数と組合せて使用する関数なのでLAMBDA関数の工夫次第でさらにエクセルが便利になりそうです。