はじめに
ExcelでSUMやAVERAGEを行ごとに何十行もコピペして集計していませんか。行が増えるたびに数式を貼り直すのは地味に時間がかかります。そして1箇所ズレるだけで集計ミスが発生することもありますよね。
そんな課題を一発で解決してくれるのが、Microsoft 365に搭載されているBYROW関数です。BYROW関数を使えば、表全体に対して「行ごとに合計」「行ごとに平均」といった処理を、1つの数式でまとめて実行できます。スピル(数式の結果が自動で隣接セルに展開される機能)によって、結果は縦1列にきれいに並びます。
この記事では、BYROW関数の構文から基本の使い方、BYCOL関数との違い、エラー対処法までを網羅的に解説します。実務ですぐ使えるサンプルを中心にまとめました。読み終わる頃には、行ごとの集計を「1つの数式でサクッと片付けられる人」になっているはずです。
BYROW関数とは?
BYROW関数(読み方:バイロウ)は、配列の各行に対してLAMBDA関数を適用し、1列の配列として結果を返す関数です。関数名は「BY(〜ごとに)+ROW(行)」に由来します。LAMBDA関数とは、自作の処理を関数化する仕組みのことです。
たとえば「3行×4列の売上表」に対してBYROWでSUMを適用すると、各行の合計値が縦1列に3つ並びます。従来のSUMをD1、D2、D3…と個別にコピペしていた作業を、1つの数式に置き換えられるのが最大のメリットです。
BYROW関数はLAMBDAヘルパー関数と呼ばれるグループの1つです。2022年2月にMicrosoft 365向けに追加されました。同じグループにはBYCOL、MAP、REDUCE、SCAN、MAKEARRAY、ISOMITTEDがあります。いずれもLAMBDAと組み合わせて配列処理を柔軟に行うための関数です。
スピル機能を前提としているため、1つのセルに数式を入力するだけで結果が自動展開されます。行数が可変のデータでも、数式側を書き換える必要はほぼありません。
BYCOLとの違いを比較表で確認
BYROWとBYCOLは兄弟のような関係で、処理の向きが違うだけで構造はほぼ同じです。どちらを使うべきか迷ったら、下の比較表でサクッと整理しましょう。
| 比較軸 | BYROW | BYCOL |
|---|---|---|
| 処理単位 | 行ごと | 列ごと |
| 戻り値のサイズ | 1列×N行(縦長) | N列×1行(横長) |
| スピル方向 | 縦方向 | 横方向 |
| 典型用途 | 行ごとの合計・平均 | 列ごとの月次集計 |
| LAMBDA引数 | row(1行分の配列) | col(1列分の配列) |
行ごとの集計(生徒ごとの合計点、商品ごとの売上など)にはBYROW。列ごとの集計(月ごとの売上、項目ごとの平均など)にはBYCOL。こう覚えておけば間違いありません。列方向の処理についてはExcelのBYCOL関数の使い方で詳しく解説しているので、セットで読むとLAMBDAヘルパー関数の理解が一気に深まります。
対応バージョン(Microsoft 365 / Excel 2024)
BYROW関数はMicrosoft公式ドキュメントによると、以下の環境で利用できます。
- Excel for Microsoft 365
- Excel for Microsoft 365 for Mac
- Excel for the web(ブラウザ版)
- Excel 2024
- Excel 2024 for Mac
一方、Excel 2021やExcel 2019以前では使えません。古いバージョンで使うと#NAME?エラーが返ります。オフィスのPCが買い切り版の古いExcelだった場合は、Microsoft 365への移行を検討するか、従来のSUM配列数式で代替する必要があります。
BYROW関数の書き方
BYROW関数は引数が2つだけのシンプルな構造です。ただしLAMBDA関数との組み合わせが必須のため、初見だと少し戸惑うかもしれません。ここで構文と引数をしっかり押さえておきましょう。
構文と引数の説明
BYROW関数の公式な構文は次の通りです。
=BYROW(array, lambda(row))
2つの引数の役割は以下の通りです。
- array(必須):処理対象の配列または範囲。たとえば
A1:C3のような複数行・複数列の範囲を指定します。 - lambda(必須):1つのパラメータ(row)を受け取り、1つの値を返すLAMBDA関数。
rowには各行が1行分の配列として順番に渡されます。
戻り値は「N列×M行の配列」を渡すと「1列×M行の配列」を返します。3行×4列を渡せば、縦に3つ並んだ結果が返ってくるイメージです。
具体例で見てみましょう。A1:C3に数値が入っているとします。
=BYROW(A1:C3, LAMBDA(row, SUM(row)))
この数式は「A1:C3の各行に対してSUMを適用し、1列×3行の結果を返す」という意味になります。1行目の合計、2行目の合計、3行目の合計が縦に並んでスピルします。
LAMBDAが必須な理由
BYROW関数の第2引数には、必ずLAMBDA関数を渡す必要があります。単にSUMとだけ書いても動作しません。
# NG:これは動かない
=BYROW(A1:C3, SUM)
# OK:LAMBDAでラップする
=BYROW(A1:C3, LAMBDA(row, SUM(row)))
理由は、BYROWが「各行をどう処理するか」を呼び出し側にカスタマイズさせる設計だからです。LAMBDAを使うことで、SUM以外にもAVERAGEや独自の計算式を自由に組み込めます。LAMBDA関数の基礎が不安な方は、先にExcelのLAMBDA関数の使い方で基本構文を確認しておくとスムーズです。
なお、LAMBDAの引数名(ここではrow)は自由に決められます。rでもgyoでも動作しますが、可読性を重視してrowにしておくのが無難です。
基本の使い方
ここからは、実務でよく使うSUM・AVERAGE・MAXを例に、BYROW関数の基本パターンを見ていきます。どれも同じ構造で応用が効くので、1つ覚えれば他もすぐ書けるようになります。
行ごとの合計(SUM)
もっとも使用頻度が高いのが、行ごとの合計です。たとえば下のような売上表があるとします。
| A列 | B列 | C列 |
|---|---|---|
| 100 | 200 | 150 |
| 80 | 90 | 110 |
| 200 | 180 | 220 |
この3行それぞれの合計を、D1セルに1つの数式で出すには次のように書きます。
=BYROW(A1:C3, LAMBDA(row, SUM(row)))
D1に入力した瞬間、D1には450、D2には280、D3には600がスピルされます。行が増えたら範囲をA1:C10のように広げるだけで、数式のコピペは不要です。
従来の方法ではD1に=SUM(A1:C1)と書いてD3まで引っ張る必要がありました。BYROWなら1つの数式で完結するため、数式のメンテナンス性が段違いです。
行ごとの平均(AVERAGE)
平均値もSUMと同じ感覚で書けます。LAMBDAの中身をSUMからAVERAGEに差し替えるだけです。
=BYROW(A1:C3, LAMBDA(row, AVERAGE(row)))
上のサンプル表に適用すると、D1には150、D2には約93.3、D3には200が縦に並びます。テストの点数表で生徒ごとの平均点を出したいときなどに、そのまま使えるパターンです。
小数点以下を整えたいときはROUND関数でラップできます。LAMBDA(row, ROUND(AVERAGE(row), 1))のように書けば、小数第1位で丸めた結果がスピルします。
行ごとの最大値(MAX)
最大値を取り出すパターンもほぼ同じ構造です。LAMBDAの中でMAXを呼び出します。
=BYROW(A1:C3, LAMBDA(row, MAX(row)))
サンプル表に適用すると、D1には200、D2には110、D3には220が返ります。「各行で最も売れた商品の金額」や「生徒ごとの最高点」を一覧化したいときに便利です。
同じ要領でMIN・COUNT・COUNTAなども使えます。ポイントは「LAMBDAの中でrowを引数として渡せる集計関数なら何でもOK」ということです。
応用例
基本を押さえたら、次は実務で差がつく応用パターンに進みましょう。BYROWはLAMBDAの中に任意の計算式を書けるため、条件付き集計やネスト計算にも対応できます。
BYROW × IFで条件付き行集計
BYROWの強みは、LAMBDAの中にIF関数を組み込んで条件付きの行集計ができる点です。たとえば「行の合計が100以上なら達成、未満なら未達」というフラグを立てたい場合、次のように書けます。
=BYROW(A1:C3, LAMBDA(row, IF(SUM(row)>=100, "達成", "未達")))
上のサンプル表なら、D1「達成」、D2「達成」、D3「達成」が縦に並びます。仮にB2を「10」、C2を「5」に変えれば、D2は「未達」に切り替わります。
SUMIFSでは書きにくい「行内の複雑な条件判定」もBYROWなら自然に書けます。たとえば「すべての列が50以上ならOK」のような判定も、LAMBDA(row, IF(MIN(row)>=50, "OK", "NG"))のように書けば一発です。
複合計算をネストする
BYROWのLAMBDA内部では、複数の関数を自由にネストできます。たとえば「各行の合計から最小値を引いた値」を出したい場合は次の通りです。
=BYROW(A1:C3, LAMBDA(row, SUM(row) - MIN(row)))
さらに複雑な例として、「各行の最大値と最小値の差(レンジ)」を算出するパターンもあります。
=BYROW(A1:C3, LAMBDA(row, MAX(row) - MIN(row)))
このように、LAMBDA内部は通常のExcel数式と同じ感覚で計算式を書けます。ただしLAMBDAは各行について必ず1つの値を返す必要がある点には注意が必要です。FILTERやSORTのように配列を返す関数を入れると、後述する#CALC!エラーが発生します。
なお、Googleスプレッドシート版のBYROWは2022年12月のアップデートで機能拡張されました。LAMBDA内にFILTER・SORT・UNIQUEなど配列を返す関数を使えるようになっています。Excel版とは仕様が異なるため、両方使う方は注意してください。
よくあるエラーと対処法
BYROW関数はLAMBDAと組み合わせる都合上、慣れないうちはエラーに遭遇しがちです。ここではMicrosoft公式ドキュメントに基づいて、発生しうる4種類のエラーと対処法をまとめておきます。
#SPILL! エラー
#SPILL!エラーは「スピル先にスペースが足りない」ときに発生します。BYROWは結果を縦方向に展開するため、スピル先のセルが空いていないと展開できません。
- 原因:スピル先の範囲に既存データが残っている、結合セルがある、またはテーブル内(Ctrl+Tで作成したテーブル)でBYROWを使っている。
- 対処:スピル先のセルをクリアする、結合セルを解除する、テーブル外のセルに数式を入力する。
テーブル機能の中ではスピル関数が動かないケースが多いです。BYROWを使うセルはテーブルの外に置くのが安全です。
#VALUE! エラー
#VALUE!エラーは、LAMBDA関数の書き方そのものに問題があるときに発生します。公式では「無効なLAMBDA関数またはパラメータ数が不正」と表現されています。
- 原因:LAMBDAが構文エラーになっている、または引数の数が合っていない(例:
LAMBDA(row, col, SUM(row))のように余計なパラメータを渡している)。 - 対処:LAMBDAの引数を1つ(
rowのみ)に修正する。そしてLAMBDAの中身が有効な数式になっているか確認する。
BYROW用のLAMBDAは必ず単一パラメータである必要があります。BYCOLから流用する場合、colをrowに書き換え忘れて動かなくなるケースが多いので注意しましょう。
#CALC! エラー
#CALC!エラーはBYROW特有のつまずきポイントで、競合記事ではあまり触れられていません。ここが理解できると一気に使いこなせるようになります。
- 原因:LAMBDA関数が提供されていない、またはLAMBDAが単一値以外(配列・複数値)を返している。
- 対処:LAMBDAの戻り値が必ず1つの値になるよう修正する。FILTER・SORT・UNIQUEなど配列を返す関数を直接使わない。
具体例を見てみましょう。
# NG:FILTERは配列を返すので#CALC!になる
=BYROW(A1:C3, LAMBDA(row, FILTER(row, row>50)))
# OK:COUNTで単一値にして返す
=BYROW(A1:C3, LAMBDA(row, COUNT(FILTER(row, row>50))))
「LAMBDAは各行について必ず1つの値を返す」というルールを守れば、#CALC!エラーは回避できます。
#NAME? エラー
#NAME?エラーは、関数名が認識されないときに出ます。BYROWの場合、ほとんどがバージョン起因です。
- 原因:Excel 2021やExcel 2019など非対応バージョンで使用している、または関数名のスペルミス(
BYROWをBIROWと書いているなど)。 - 対処:Microsoft 365またはExcel 2024を使う。スペルミスがないか確認する。
職場のPCで#NAME?が出る場合は、まずExcelのバージョンを確認してください。「ファイル」→「アカウント」から製品バージョンが確認できます。Microsoft 365以外ならBYROWは使えません。
まとめ
ExcelのBYROW関数について、構文から応用まで一気に解説しました。ポイントを�条書きで整理しておきます。
- BYROW関数は行ごとにLAMBDAを適用し、1列の結果をスピルで返す関数である。
- 構文は
=BYROW(array, lambda(row))で、第2引数はLAMBDAが必須である。 - 対応バージョンはMicrosoft 365・Excel for the web・Excel 2024。Excel 2021以前では#NAME?エラーになる。
- 基本はSUM・AVERAGE・MAXを行ごとに適用するパターン。LAMBDA内部の関数を差し替えるだけで応用できる。
- BYROW × IFで条件付き行集計ができる。SUMIFSで書きにくい複雑条件にも対応可能。
- エラーは#SPILL!(スピル先不足)、#VALUE!(LAMBDAの書き方)、#CALC!(配列戻り値)、#NAME?(バージョン非対応)の4種類を押さえておけばOK。
- #CALC!エラーはLAMBDAが単一値以外を返した場合に発生する。FILTER・SORTなどをそのまま入れるとNG。
BYROWを一度覚えると、従来の「1行ごとにSUMをコピペ」作業からは完全に卒業できます。行数が増えても数式を書き換える必要がなく、可読性もメンテ性もアップします。
次のステップとして、列方向の処理を扱うExcelのBYCOL関数の使い方もセットで読んでおくとよいでしょう。LAMBDAヘルパー関数クラスター全体を体系的に理解できます。LAMBDA自体の書き方が気になった方は、ExcelのLAMBDA関数の使い方で基礎から復習しておくと安心です。
