「売上表の各行合計を1つの数式でまとめて出したい」「複数の配列を要素ごとに掛け合わせたい」「月次売上の累積推移を自動で展開したい」――LAMBDA関数でカスタム関数を定義できるようになったあと、その次のステップとして使いこなしたいのがLAMBDA応用集計関数群です。
本記事では、Excel 365(Microsoft 365版Excel)で利用できる6つのLAMBDAヘルパー関数――BYROW・BYCOL・MAP・SCAN・REDUCE・MAKEARRAY――の構文と実務パターンを体系的に解説します。これらはすべて、MOS Excel 365 エキスパート(MO-211)の「高度な機能を使用した数式およびマクロの作成」の出題範囲に含まれます。分野別の出題数・配点は公表されていません。
6関数の役割と一覧
まず全体像を把握するため、各関数の役割を比較します。
| 関数 | 処理の単位 | 返す値 | 典型的な用途 |
|---|---|---|---|
| BYROW | 行ごと | 各行の処理結果(1列の配列) | 行ごとの合計・最大値・条件判定 |
| BYCOL | 列ごと | 各列の処理結果(1行の配列) | 列ごとの平均・最小値・カウント |
| MAP | 要素ごと | 同じサイズの配列 | 要素ごとの掛け算・条件変換・単位変換 |
| SCAN | 要素を順に積み上げ | 中間値を含む全結果(元と同じ行数) | 累積合計・ランニングトータル |
| REDUCE | 要素を順に積み上げ | 最終結果の1値のみ | カスタム集計・AND/OR条件の全判定 |
| MAKEARRAY | インデックス(行番号・列番号)ごと | 指定サイズの配列 | 掛け算表・距離マトリクス・カレンダー生成 |
これらはすべて第2引数または最終引数にLAMBDA関数を渡すことで動作します。LAMBDA関数の基本(引数設計・名前マネージャー登録)を先に習得しておくと、以下の解説がスムーズに理解できます。
BYROW関数:行ごとにLAMBDAを適用する
構文
=BYROW(配列, LAMBDA(行変数, 処理))
| 引数 | 説明 |
|---|---|
| 配列 | 処理対象のセル範囲または配列 |
| LAMBDA | 1つの引数(その行全体を受け取る変数)をとり、スカラー値を返す式 |
BYROWは配列の各行を順番に取り出し、LAMBDA引数として渡します。LAMBDAが返した値を縦に並べた配列をスピル展開します。LAMBDAは必ずスカラー値(1つの値)を返す必要があります。複数セルを返す式を書くとエラーになります。
例1:各行の合計を1列にまとめる
A2:D6に月別・商品別の売上数量が入っているとします。E2セルに各行(商品ごと)の合計をまとめて展開するには次のように入力します。
=BYROW(A2:D6, LAMBDA(行, SUM(行)))
従来ならE2に =SUM(A2:D2) と入力してE6までオートフィルするところ、BYROWを使えば1つの数式で5行分の合計が自動的にE2:E6にスピル展開されます。元データの行数が変わっても数式の書き換えが不要です。
例2:行ごとに条件判定して○×を付ける
=BYROW(B2:E11, LAMBDA(行, IF(MAX(行)>=100,"○","×")))
各行の最大値が100以上であれば「○」、未満なら「×」を返します。SUM以外にも、MAX・MIN・AVERAGE・COUNTA・TEXTJOINなどLAMBDA内で使える関数に制限はありません。
BYCOL関数:列ごとにLAMBDAを適用する
構文
=BYCOL(配列, LAMBDA(列変数, 処理))
BYROWの列版です。配列の各列を順番に取り出してLAMBDAに渡し、返った値を横に並べた配列を返します。結果は1行の横並び配列になります。
例:列ごとの平均を横一列に展開する
=BYCOL(B2:E6, LAMBDA(列, AVERAGE(列)))
B2:E6の4列分の平均がB8:E8(横4セル)にスピル展開されます。集計行をオートフィルで作る代わりに1式で完結します。AVERAGE以外にも COUNTA(列)(データ件数)・MIN(列)(最小値)など自由に使えます。
BYROW・BCOLのよくあるエラー
- #VALUE!(値エラー):LAMBDAが複数セルを返している場合。LAMBDA内の最後の式がスカラー値になっているか確認します。
- #CALC!(スピルエラー):結果を展開しようとしたセル範囲に既存のデータがある場合。展開先を空にしてから再入力します。
MAP関数:要素ごとにLAMBDAを適用する
構文
=MAP(配列1, [配列2, ...], LAMBDA(変数1, [変数2, ...], 処理))
MAPは配列の対応する位置の要素同士をLAMBDAに渡し、同じサイズの結果配列を返します。1つの配列だけを渡せば要素ごとの変換になり、2つ以上渡せば要素ごとの組み合わせ演算になります。複数の配列は行数・列数が一致している必要があります。
例1:単価×数量を要素ごとに計算する
B列に単価(B2:B10)、C列に数量(C2:C10)があるとします。D2に金額をまとめて展開します。
=MAP(B2:B10, C2:C10, LAMBDA(単価, 数量, 単価*数量))
単純な掛け算であれば =B2:B10*C2:C10 という動的配列数式でも同じ結果を得られます。MAPの真価は、条件分岐や文字列処理など複雑な変換ロジックをLAMBDAにまとめられる点にあります。
例2:条件に応じてラベルを割り当てる
=MAP(B2:B10, C2:C10, LAMBDA(単価, 数量, IF(単価*数量>=10000,"大口","通常")))
金額が10,000以上なら「大口」、未満なら「通常」というラベルを全行に対してスピル展開します。IFSやSWITCH、TEXTJOIN、TEXT関数など任意の式をLAMBDA内に書けます。
SCAN関数:累積演算で中間値を全部返す
構文
=SCAN([初期値], 配列, LAMBDA(アキュムレータ, 現在値, 処理))
| 引数 | 説明 |
|---|---|
| 初期値 | 累積の開始値。省略可(省略すると配列の最初の要素が初期値となり、処理は2番目の要素から始まる) |
| 配列 | 処理対象の配列 |
| LAMBDA | アキュムレータ(前の計算結果)と現在値の2引数を受け取り、次のアキュムレータ値を返す式 |
SCANはREDUCE(後述)と同じ累積計算をしますが、各ステップの中間値を全部返す点が異なります。元の配列と同じ行数・列数の結果配列がスピル展開されます。
例:月次売上の累積合計を展開する
B2:B13に1月~12月の売上金額があるとします。C2から累積合計を展開します。
=SCAN(0, B2:B13, LAMBDA(累積, 今月, 累積+今月))
C2 = 1月分、C3 = 1月+2月分、…、C13 = 1月~12月の総合計、という形でスピル展開されます。従来なら =SUM($B$2:B2) を入力してオートフィルする方法がありましたが、SCANを使うと1式で完結し、行の挿入・削除にも自動対応します。
REDUCE関数:累積演算で最終値だけを返す
構文
=REDUCE([初期値], 配列, LAMBDA(アキュムレータ, 現在値, 処理))
REDUCEの構文はSCANと同じですが、返すのは最終的な累積結果の1値のみです。スピル展開は発生しません。中間値が不要で最終集計結果だけほしい場合に使います。
例1:カスタム乗算集計(全要素の積)
=REDUCE(1, B2:B6, LAMBDA(積, 現在値, 積*現在値))
B2:B6の全要素の積(掛け算の連鎖)を返します。Excelには全要素の積を返す専用関数 PRODUCT がありますが、REDUCEを使えば「偶数要素だけの積」「条件を満たす行の積」のようなカスタムロジックも自由に実装できます。
例2:配列の全要素が条件を満たすか判定する
=REDUCE(TRUE, B2:B10, LAMBDA(判定, 値, 判定 * (値 > 0)))
B2:B10の全値が0より大きいときのみTRUEを返します。REDUCE初期値をTRUE(=1)にし、要素ごとに 判定 AND (値>0) を累積します。AND(B2:B10>0) と同じ結果ですが、より複雑な多段階条件もLAMBDA内に書けます。
MAKEARRAY関数:インデックスから配列を生成する
構文
=MAKEARRAY(行数, 列数, LAMBDA(行インデックス, 列インデックス, 処理))
MAKEARRAYは指定した行数・列数の配列を作成し、各要素を LAMBDA(行インデックス, 列インデックス, 式) で計算します。行インデックスは1から行数、列インデックスは1から列数まで自動的に渡されます。
例1:掛け算表を自動生成する
=MAKEARRAY(9, 9, LAMBDA(行, 列, 行*列))
1×1から9×9までの81セルの掛け算表が1式でスピル展開されます。行と列のインデックスがそのまま1~9の整数として渡されるため、インデックス同士を掛け合わせるだけで完成します。
例2:拠点間距離マトリクスを生成する
E2:E7に拠点ごとのX座標、F2:F7にY座標が入っているとします。各拠点間のユークリッド距離マトリクス(6×6)をMAKEARRAYで生成します。
=MAKEARRAY(6, 6, LAMBDA(行, 列,
SQRT((INDEX($E$2:$E$7, 行) - INDEX($E$2:$E$7, 列))^2
+ (INDEX($F$2:$F$7, 行) - INDEX($F$2:$F$7, 列))^2)
))
この1式で36セルの距離マトリクスが生成されます。拠点数が変わった場合も行数・列数の引数を変えるだけで対応できます。
実務シナリオ:関数を組み合わせて使う
シナリオ1:社員別の達成率を計算し、未達行にフラグを立てる
B2:E11に社員別(10名)×月別(4か月)の売上実績、G2:G11に各社員の目標値が入っているとします。各社員の4か月合計が目標に対して何%かを求め、未達(100%未満)に「要フォロー」フラグを立てます。
H2セル: =BYROW(B2:E11, LAMBDA(行, SUM(行)/INDEX($G$2:$G$11, ROW()-1) * 100))
I2セル: =MAP(H2#, LAMBDA(率, IF(率<100,"要フォロー","")))
H2のBYROWで達成率(%)を求め、その結果(H2#のスピル参照)をMAPで文字ラベルに変換します。2段階に分けることで、数式が読みやすくなります。LET関数と組み合わせれば1式にまとめることもできます。
シナリオ2:月次受注件数の累積を動的に表示する
B2:B13に月次受注件数(12か月分)が入っているとします。C2から累積件数を展開し、最終値(年間総件数)をD2に取り出します。
C2セル(月ごとの累積): =SCAN(0, B2:B13, LAMBDA(累積, 今月, 累積+今月))
D2セル(年間合計のみ): =REDUCE(0, B2:B13, LAMBDA(累積, 今月, 累積+今月))
SCANは12か月分の中間値すべてをC2:C13にスピル展開し、REDUCEは最終合計の1値のみをD2に返します。SUM(B2:B13)でも最終合計は求められますが、SCAN/REDUCEはより複雑な累積ロジック(条件付き加算・掛け算の連鎖など)に拡張できます。
MOS Excel 365 エキスパート(MO-211)での位置づけと対策
BYROW・BYCOL・MAP・SCAN・REDUCE・MAKEARRAYは、MOS Excel 365 エキスパート(MO-211)の4領域のうち「高度な機能を使用した数式およびマクロの作成」の出題範囲に含まれます。分野別の出題数・配点は公表されていません。
試験時間は50分、採点は1000点満点です。合格点は非公開で550点~850点が目安とされています。出題形式は5個~10個のプロジェクトで構成されます。
学習のロードマップ
- Step1:LAMBDA関数の基本を習得する(引数設計・名前マネージャーへの登録・再帰LAMBDAの概念)
- Step2:BYROW・BCOLでLAMBDAに「行・列の配列を渡す」感覚をつかむ(SUM・MAX・AVERAGEをLAMBDA内で使う練習)
- Step3:MAPで「要素×要素の演算」を練習する(単純な掛け算→条件分岐→文字列加工の順に難易度を上げる)
- Step4:SCAN・REDUCEで「アキュムレータ」の概念を理解する(累積合計から始め、カスタム集計へ)
- Step5:MAKEARRAYで「インデックスから配列を生成する」パターンを体得する
MOS Excel 365 エキスパートの学習時間の目安として、アソシエイト(MO-210)合格後に追加で60~100時間が目安です(公式非公表のため目安)。LAMBDAヘルパー関数はSEQUENCE・FILTER・UNIQUEなどの動的配列関数を理解した後に取り組むと習得が早まります。
出題範囲名の正確な表記
MOS Excel 365 エキスパート(MO-211)の4領域の正確な名称は以下のとおりです。試験対策の資料を作成するときや模擬問題の分類をするときに1文字も変えず使用してください。
- ブックのオプションと設定の管理
- データの管理、書式設定
- 高度な機能を使用した数式およびマクロの作成
- 高度な機能を使用したグラフやテーブルの管理
よくある質問(FAQ)
Q1. Excel 2021でもBYROW・BCOLなどのLAMBDAヘルパー関数は使えますか?
BYROW・BYCOL・MAP・SCAN・REDUCE・MAKEARRAYはMicrosoft 365のサブスクリプション版Excelに搭載されており、Excel 2021(永続ライセンス版)では利用できません。Microsoft 365で作成したファイルをExcel 2021で開いた場合、これらの関数は#NAME?エラーになります。
Q2. BYROW内でIFを使うとエラーになる場合があるのはなぜですか?
LAMBDA内で IF(条件, 配列, 配列) のように配列を返す式を書いた場合、結果が複数値になりスカラー値を期待するBYROW/BCOLが#VALUE!を返すことがあります。LAMBDAの最後の式が必ず1つの値(スカラー)を返すように設計してください。たとえば IF(MAX(行)>=100,"○","×") は行の最大値というスカラーを条件に使っているので問題ありません。
Q3. REDUCEとSUMIFS・COUNTIFSの違いはどこですか?
SUMIFS・COUNTIFSは「特定の条件を満たすセルの合計・件数」という固定の集計ロジックに特化しています。REDUCEはLAMBDAで集計ロジックそのものを定義できるため、「条件付き積(掛け算の連鎖)」「累積最大値」「文字列の条件付き結合」など標準関数では一発で書きにくい集計を実装できます。まずSUMIFS・COUNTIFSで対応できるか考え、それで不足する場合にREDUCEを使う、という使い分けが実務では自然です。
Q4. MAPに3つ以上の配列を渡せますか?
渡せます。LAMBDAの引数の数と配列の数を一致させれば、理論上は任意の数の配列を渡せます。ただし全ての配列は行数・列数が一致している必要があります。引数が増えると数式が長くなり可読性が下がるため、4つ以上になる場合はLET関数で中間変数を定義するか、BYROWやREDUCEへの分割を検討してください。
Q5. MAKEARRAYの行インデックス・列インデックスは0始まりですか?
1始まりです。=MAKEARRAY(3, 3, LAMBDA(行, 列, 行*列)) の場合、行インデックスは1・2・3、列インデックスも1・2・3が渡されます。0始まりのインデックスが必要な場合は 行-1・列-1 として計算してください。
まとめ
BYROW・BYCOL・MAP・SCAN・REDUCE・MAKEARRAYは、LAMBDA関数で定義したロジックを「行ごと・列ごと・要素ごと・累積的」に配列全体へ適用するためのLAMBDAヘルパー関数です。
| 関数 | 使いどき |
|---|---|
| BYROW | 各行の集計・判定を1式で展開したい |
| BYCOL | 各列の集計・判定を1式で展開したい |
| MAP | 複数配列の要素ごとの変換・組み合わせ演算 |
| SCAN | 累積合計・ランニングトータルなど中間値も必要な累積処理 |
| REDUCE | カスタム集計で最終値だけが必要な場合 |
| MAKEARRAY | 行・列インデックスから配列をゼロから生成したい |
これらをLET・FILTER・SEQUENCE・SORTBYなどの動的配列関数と組み合わせると、VBAなしで高度なデータ処理パイプラインをシート上に構築できます。MOS Excel 365 エキスパート(MO-211)の「高度な機能を使用した数式およびマクロの作成」の準備として、LAMBDA関数の基本をしっかり固めた上で1関数ずつ実際に手を動かして習得することを推奨します。
PR
MOS Excel 365 エキスパート(MO-211)に完全対応した定番対策書。LAMBDA・BYROW・BYCOLなどの高度な数式・マクロの出題範囲をプロジェクト形式の実技問題で体系的に学べる。試験本番の操作感覚を事前につかむのに最適な一冊。
PR
LAMBDA・MAP・BYROW・REDUCEなどExcel 365の最新関数を実務シナリオで丁寧に解説。Copilotを活用した数式作成のヒントも収録されており、関数を体系的に学び直したいすべてのExcelユーザーに適した1冊。
MOS試験の最新の受験料は、公式サイトの「受験料・価格」(https://mos.odyssey-com.co.jp/exam/examfee.html)でご確認ください。
