Excelの各行から複数列を返すBYROW2関数

LWP | Excelの各行から複数列を返すBYROW2関数

LWP TECHNICAL ARTICLE | 162

Excelの各行から複数列を返す
BYROW2関数

標準BYROWの「1行につき1値」という制約を、REDUCEとVSTACKで越える

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

ExcelのBYROWは、配列を1行ずつLAMBDAへ渡せる便利な関数です。しかし、各行のLAMBDAが返せるのは1つの値であり、合計・平均・最大値のような複数の結果を横方向へ一度に返すことはできません。

固定された数種類の集計だけなら、複数のBYROWをHSTACKで並べる方法が最も単純です。一方、「1行を受け取り、複数列からなる新しい1行を返す」という処理を何度も再利用したい場合は、行番号をREDUCEで走査し、各行の結果をVSTACKで積み上げる名前付きLAMBDAが役立ちます。

この記事では、この汎用LAMBDAをBYROW2として作成します。単に完成式を示すのではなく、通常式を選ぶ場面、名前付きLAMBDAにする場面、TOROWによる平坦化、出力列数が異なる場合の#N/A、代替実装との違いまで整理します。

本記事の対象とゴール

想定読者

  • BYROWとLAMBDAの基本的な使い方を理解している方

  • 行ごとに複数の集計値や加工結果を返したい方

  • 再利用できる名前付きLAMBDAを設計したい方

  • REDUCEを数値集計以外の配列構築へ応用したい方

本記事で得られること

  1. 標準BYROWが複数列を返せない理由を説明できます。

  2. 固定された集計と汎用的な行変換を使い分けられます。

  3. REDUCE、CHOOSEROWS、TOROW、VSTACKを組み合わせて行変換関数を作れます。

  4. 平坦化、列数不一致、計算量などの制約を理解したうえで運用できます。

目次

  • はじめに 標準BYROWが返せるのは1行につき1値

  • 第1章 最初に通常式で解く

  • 第2章 再利用できるBYROW2を作る

  • 第3章 数式を部品ごとに読む

  • 第4章 実務で使える行変換

  • 第5章 制約と設計上の注意

  • 第6章 代替案をどう選ぶか

  • まとめ 通常式と名前付きLAMBDAを使い分ける

はじめに 標準BYROWが返せるのは1行につき1値

0.1 標準BYROWの役割

BYROWは、入力配列を1行ずつLAMBDAへ渡し、各行の計算結果を縦方向へ返します。

たとえば、A2:C4の各行の合計を求める式は次のとおりです。

=BYROW(A2:C4,LAMBDA(r,SUM(r)))

元データが次の場合を考えます。

A列 B列 C列
1 2 3
4 5 6
7 8 9

結果は、6、15、24が縦方向へ並ぶ1列の配列です。

このように、標準BYROWは「1行を1つの値へ集約する」処理に適しています。

0.2 複数列を返そうとすると失敗する

各行について、合計、平均、最大値を同時に返したいとします。直感的には、次のように書きたくなります。

=BYROW(
    A2:C4,
    LAMBDA(r,
        HSTACK(
            SUM(r),
            AVERAGE(r),
            MAX(r)
        )
    )
)

しかし、BYROWのLAMBDAは各行について単一の値を返す必要があります。HSTACKが返す横3列の配列は受け付けられず、#CALC!になります。

ここで必要なのは、BYROWの書き方を少し変えることではありません。各行を取り出し、複数列の結果を作り、それらを縦へ積み上げる別の配列構築処理です。

第1章 最初に通常式で解く

1.1 固定された集計ならHSTACKと複数のBYROWでよい

合計、平均、最大値という3種類の集計が固定されているなら、名前付きLAMBDAを作る前に次の式を検討します。

=HSTACK(
    BYROW(A2:C4,LAMBDA(r,SUM(r))),
    BYROW(A2:C4,LAMBDA(r,AVERAGE(r))),
    BYROW(A2:C4,LAMBDA(r,MAX(r)))
)

結果は次の3列です。

合計 平均 最大値
6 2 3
15 5 6
24 8 9

この式には、次の利点があります。

  • 標準関数だけで意味を読み取れる

  • 名前の管理へ登録する必要がない

  • 集計ごとの処理が明示される

  • 一度しか使わない処理に過剰な抽象化を持ち込まない

1.2 名前付きLAMBDAが有効になる条件

次のような場合は、汎用的な行変換関数を用意する価値があります。

  • 同じ「1行から複数列を返す」処理を複数箇所で使う

  • 元の行と計算列をまとめて返す

  • 集計だけでなく文字列加工や判定結果も返す

  • 呼び出し側をBYROWに近い形へ統一したい

つまり、BYROW2は標準BYROWの置き換えではありません。再利用する行変換を、1つの名前へまとめるための関数です。

第2章 再利用できるBYROW2を作る

2.1 名前の管理へ登録する式

「数式」タブの「名前の管理」で、新しい名前BYROW2を作成し、「参照範囲」へ次のLAMBDAを登録します。

=LAMBDA(src,row_fn,
    DROP(
        REDUCE(
            "",
            SEQUENCE(ROWS(src)),
            LAMBDA(result,row_no,
                VSTACK(
                    result,
                    TOROW(
                        row_fn(
                            CHOOSEROWS(src,row_no)
                        )
                    )
                )
            )
        ),
        1
    )
)

引数の役割は次のとおりです。

引数 役割
src 行単位で処理する入力配列
row_fn 1行を受け取り、1つ以上の値を返すLAMBDA

2.2 呼び出し方

登録後は、標準BYROWに近い形で呼び出せます。

=BYROW2(
    A2:C4,
    LAMBDA(r,
        HSTACK(
            SUM(r),
            AVERAGE(r),
            MAX(r)
        )
    )
)

row_fnが返す横3列が、入力行数分だけ縦へ積み上がります。

2.3 完成結果

合計 平均 最大値
6 2 3
15 5 6
24 8 9

最終的な配列サイズは、原則として次のようになります。

行数 = ROWS(src)
列数 = row_fnが返す値の個数

第3章 数式を部品ごとに読む

3.1 行番号を作る

SEQUENCE(ROWS(src))

入力が3行なら、SEQUENCEは{1;2;3}に相当する縦配列を返します。REDUCEは、この行番号を1つずつ処理します。

3.2 現在の行を取り出す

CHOOSEROWS(src,row_no)

row_no=2なら、入力配列の2行目だけを返します。A2:C4が前掲の数値なら、結果は{4,5,6}です。

3.3 利用者のLAMBDAを実行する

row_fn(CHOOSEROWS(src,row_no))

BYROW2は、行に対して何をするかを知りません。合計するのか、文字列を結合するのか、元の値へ計算列を加えるのかは、呼び出し側のrow_fnが決めます。

この責任分担により、BYROW2本体は「行を渡し、結果を積み上げる」ことへ集中できます。

3.4 戻り値を横1行へ平坦化する

TOROW(row_fn(...))

TOROWは、戻り値を横1行へ変換します。

row_fnの戻り値 TOROW後
スカラー 1列の行
横配列 その並びを維持
縦配列 横配列へ変換
2次元配列 行方向の順序で1行へ平坦化

ここは単なる見た目の調整ではありません。BYROW2には、「各行の戻り値を横1行として扱う」という契約があります。2次元の形を保存したい処理には向きません。

3.5 VSTACKで結果を積み上げる

VSTACK(result,TOROW(row_fn(...)))

resultは、それまでに完成した行の集合です。現在行の処理結果を下へ追加することで、最終的な2次元配列を作ります。

REDUCEは数値の合計だけに使う関数ではありません。アキュムレーターへ配列を保持させれば、処理のたびに配列を成長させられます。

3.6 先頭のダミー行をDROPする

REDUCEの初期値には空文字""を渡しています。そのままでは先頭に不要な行が残るため、最後に次の処理を行います。

DROP(作成した配列,1)

この方法は先頭行だけをIFで分岐する実装より処理が一つ増えますが、数式全体の流れが直線的で、読みやすいという利点があります。

第4章 実務で使える行変換

4.1 元の行へ計算列を追加する

次の式は、元の3列に合計と範囲を加えます。範囲は最大値から最小値を引いた値です。

=BYROW2(
    A2:C4,
    LAMBDA(r,
        HSTACK(
            r,
            SUM(r),
            MAX(r)-MIN(r)
        )
    )
)

結果は次の5列です。

元1 元2 元3 合計 範囲
1 2 3 6 2
4 5 6 15 2
7 8 9 24 2

この形は、「元の行を残したまま複数の派生列を追加する」処理に向いています。

4.2 4種類の集計値を返す

=BYROW2(
    A2:F10,
    LAMBDA(r,
        HSTACK(
            SUM(r),
            AVERAGE(r),
            MIN(r),
            MAX(r)
        )
    )
)

呼び出し側のLAMBDAを変更するだけで、BYROW2本体はそのまま再利用できます。

4.3 文字列加工と件数を同時に返す

=BYROW2(
    A2:C10,
    LAMBDA(r,
        HSTACK(
            TEXTJOIN("/",TRUE,r),
            INDEX(r,1,1)&"-"&INDEX(r,1,2),
            COUNTA(r)
        )
    )
)

各行から、連結文字列、先頭2項目の組み合わせ、空白でないセル数を返します。数値集計に限らず、1行から複数の説明列を作る用途にも使えます。

第5章 制約と設計上の注意

5.1 各行の出力列数をそろえる

VSTACKは、最も列数の多い行に合わせて結果を作ります。行ごとの列数が異なる場合、不足部分は#N/Aで埋められます。

1行目:3列
2行目:5列
3行目:2列

このような出力を意図していないなら、row_fnはすべての入力行について同じ列数を返すように設計します。

5.2 TOROWは2次元配列を平坦化する

TOROWは縦横を入れ替えるだけではありません。2行2列の戻り値も、4列の1行へ変換します。

そのため、次の用途は区別します。

  • 1行から複数の値を返す: BYROW2が適する

  • 1行から複数行・複数列のブロックを返す: 別の設計が必要

5.3 空白とエラーの扱いを決める

引数を省略したTOROWは、空白やエラーを自動的には除外しません。戻り値に含まれる空白やエラーも配列の要素として保持します。

空白を無視する必要がある場合はTOROW(array,1)、エラーを無視する場合はTOROW(array,2)を検討できます。ただし、エラーを除外すると問題の発見が遅れる可能性があるため、汎用関数側で無条件に消さない方が安全です。

5.4 対応バージョンを確認する

この式では、LAMBDA、REDUCE、VSTACK、TOROW、CHOOSEROWS、DROPなどの動的配列関数を使用します。利用環境で各関数が使えることを確認してください。

配布用ブックでは、関数名だけでなく、対象となるExcelのエディションと更新チャネルも明記すると安全です。

5.5 名前は仕様を伝える

BYROW2は覚えやすい一方で、標準BYROWの完全な上位互換ではありません。出力の形とTOROWによる平坦化が異なります。

チーム内で公開する場合は、MAPROWSやROWS_TO_ARRAYのような名前も候補になります。既存資産との連続性を優先するならBYROW2を維持し、名前の管理のコメント欄へ仕様を書きます。

各入力行へrow_fnを適用し、戻り値をTOROWで1行化して縦に積み上げる。
各行の戻り値は同じ列数にする。

第6章 代替案をどう選ぶか

6.1 先頭行を特別扱いする版

ダミー行を作りたくない場合は、元原稿のように1行目だけ結果を直接返せます。

=LAMBDA(src,row_fn,
    REDUCE(
        "",
        SEQUENCE(ROWS(src)),
        LAMBDA(result,row_no,
            LET(
                current,
                    TOROW(
                        row_fn(
                            CHOOSEROWS(src,row_no)
                        )
                    ),
                IF(
                    row_no=1,
                    current,
                    VSTACK(result,current)
                )
            )
        )
    )
)

この版は不要な先頭行を生成しません。一方、初回だけ分岐するため、教材としてはDROP版より少し読みづらくなります。どちらを選ぶかは、微小な配列操作より可読性を優先して判断します。

6.2 TOROWを使わない版

呼び出し側が必ず横1行を返すと決めるなら、TOROWを省略できます。

=LAMBDA(src,row_fn,
    DROP(
        REDUCE(
            "",
            SEQUENCE(ROWS(src)),
            LAMBDA(result,row_no,
                VSTACK(
                    result,
                    row_fn(
                        CHOOSEROWS(src,row_no)
                    )
                )
            )
        ),
        1
    )
)

責任分担は明確になりますが、利用者が縦配列を返すと行数が増え、意図した長方形にならない可能性があります。配布用の汎用関数では、仕様を明示したTOROW版が扱いやすいでしょう。

6.3 MAKEARRAY版

出力列数を先に求め、MAKEARRAYで完成サイズの配列を作ることもできます。

=LAMBDA(src,row_fn,
    LET(
        width,
            COLUMNS(
                TOROW(
                    row_fn(
                        CHOOSEROWS(src,1)
                    )
                )
            ),
        MAKEARRAY(
            ROWS(src),
            width,
            LAMBDA(row_no,column_no,
                INDEX(
                    TOROW(
                        row_fn(
                            CHOOSEROWS(src,row_no)
                        )
                    ),
                    1,
                    column_no
                )
            )
        )
    )
)

完成サイズが式に現れる点は明快です。ただし、式の構造上、同じ行に対するrow_fnが出力セルごとに記述されています。処理の重さを判断する場合は、実データで計測してください。

6.4 再帰版

自己適用型LAMBDAでも実装できます。

=LAMBDA(src,row_fn,
    LET(
        RowResult,
            LAMBDA(row_no,
                TOROW(
                    row_fn(
                        CHOOSEROWS(src,row_no)
                    )
                )
            ),
        WalkRows,
            LAMBDA(Self,row_no,result,
                IF(
                    row_no>ROWS(src),
                    result,
                    Self(
                        Self,
                        row_no+1,
                        VSTACK(
                            result,
                            RowResult(row_no)
                        )
                    )
                )
            ),
        WalkRows(
            WalkRows,
            2,
            RowResult(1)
        )
    )
)

再帰処理の教材としては有用ですが、行番号を順番に畳み込む目的にはREDUCEの方が短く、意図も伝わりやすくなります。

6.5 選択基準

状況 第一候補
集計の種類が固定され、1回だけ使う 複数のBYROWをHSTACK
同じ行変換を繰り返し使う BYROW2
出力サイズをセル単位で定義したい MAKEARRAY
状態遷移や終了条件そのものを教えたい 再帰LAMBDA
1行につき1値だけ返す 標準BYROW

まとめ 通常式と名前付きLAMBDAを使い分ける

標準BYROWは、各行を1つの値へ集約する関数です。複数列の配列を返すLAMBDAは受け付けません。

固定された合計、平均、最大値を求めるだけなら、複数のBYROWをHSTACKする式が最も読みやすい方法です。処理を再利用し、1行から任意数の列を返したい場合は、REDUCEで行番号を走査し、VSTACKで結果を積み上げるBYROW2が役立ちます。

設計上の要点は次の5点です。

  1. SEQUENCEで行番号を作る。

  2. CHOOSEROWSで現在の行を取り出す。

  3. 利用者のrow_fnを実行する。

  4. TOROWで戻り値を横1行へ平坦化する。

  5. VSTACKで各行の結果を積み上げる。

便利な汎用関数であっても、通常式より常に優れているわけではありません。再利用性が必要なところだけを名前付きLAMBDAにし、出力の形、平坦化、列数不一致の規約を明示することが、読みやすく壊れにくい数式設計につながります。

参考資料

  • Microsoft Support「BYROW function」

  • Microsoft Support「LAMBDA function」

  • Microsoft Support「REDUCE function」

  • Microsoft Support「TOROW function」

  • Microsoft Support「VSTACK function」

  • Microsoft Support「CHOOSEROWS function」

  • Microsoft Support「DROP function」

  • Microsoft Support「MAKEARRAY function」

出典メモ

  • 元原稿: BYROW2_各行の結果を横方向へスピルする汎用LAMBDA.md

  • 元原稿の主張、数式、実用例、代替案を基礎に、公開記事として通常式との使い分け、関数の契約、対応環境、制約を補い、重複説明を再構成した。

  • Excel関数の仕様は、2026年8月9日にMicrosoft SupportのBYROW、LAMBDA、REDUCE、TOROW、VSTACK、CHOOSEROWS、DROP、MAKEARRAY各ページで確認した。

  • 数式の実際の計算時間は、ブック構成、データ量、更新チャネルに左右されるため、特定の性能差は断定していない。