ExcelのBYROW関数の使い方|行ごとに関数を適用

スポンサーリンク

はじめに

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は兄弟のような関係で、処理の向きが違うだけで構造はほぼ同じです。どちらを使うべきか迷ったら、下の比較表でサクッと整理しましょう。

比較軸BYROWBYCOL
処理単位行ごと列ごと
戻り値のサイズ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列
100200150
8090110
200180220

この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から流用する場合、colrowに書き換え忘れて動かなくなるケースが多いので注意しましょう。

#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など非対応バージョンで使用している、または関数名のスペルミス(BYROWBIROWと書いているなど)。
  • 対処: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関数の使い方で基礎から復習しておくと安心です。

タイトルとURLをコピーしました