【Excel】BYROW関数で行ごとの集計を1つの数式で求める方法

この記事は約6分で読めます。

今回は、ExcelのBYROW関数を使って、表の行ごとの集計を1つの数式で求める方法を紹介します。

この記事は、BYROW関数とLAMBDA関数が使えるExcel(Microsoft 365のExcelなど)を前提にしています。BYROW関数は比較的新しい関数のため、古いバージョンの買い切り版Excelでは使えない場合があります。お使いのExcelで関数名を入力し、候補に表示されるかを確認してから試してください。

BYROW関数とは

BYROW関数は、指定した範囲の各行に同じ計算(LAMBDA関数)を当てはめ、行ごとの結果をまとめて返す関数です。たとえば3列×2行の範囲を指定すると、1列×2行の結果が返ります。

これまで行ごとの合計を出すときは、1行目に=SUM(B2:D2)と入力し、下の行へコピーするのが一般的でした。BYROW関数を使えば、先頭のセルに1つの数式を入力するだけで、すべての行の結果が下方向に表示(スピル)されます。行数が変わったときに数式をコピーし直す手間を減らせます。

BYROW関数の書式

書式は次のとおりです。

=BYROW(array, lambda(row))

  • array:行ごとに処理したい範囲や配列を指定します。
  • lambda:1行分のデータを受け取り、1つの結果を返すLAMBDA関数を指定します。
  • row:LAMBDA関数の中で使う、1行分のデータを表す名前です。名前は自由に付けられます。

LAMBDA関数の部分は「LAMBDA(名前, 計算)」の形で書きます。最初に付けた名前が1行分のデータを表し、その名前を使って計算式を書きます。

基本の使い方

ここでは、A列に担当者名、B列からD列に4月・5月・6月の売上が入力されている表(2行目から6行目がデータ)を例にします。

行ごとの合計を求める

E2セルに次の数式を入力します。

=BYROW(B2:D6, LAMBDA(r, SUM(r)))

E2からE6に、担当者ごとの3か月分の合計が表示されます。数式の意味は「B2:D6の各行をrとして受け取り、SUM(r)を計算する」です。

行ごとの最大値・平均を求める

LAMBDA関数の中の関数を入れ替えるだけで、別の集計に切り替えられます。

  • 行ごとの最大値:=BYROW(B2:D6, LAMBDA(r, MAX(r)))
  • 行ごとの最小値:=BYROW(B2:D6, LAMBDA(r, MIN(r)))
  • 行ごとの平均:=BYROW(B2:D6, LAMBDA(r, AVERAGE(r)))

「何を計算するか」をLAMBDA関数の中に書き、「どの範囲を行ごとに処理するか」を第1引数で指定する、という分担を意識すると、数式を組み立てやすくなります。

応用的な使い方

条件を満たす月の数を数える

売上が100以上だった月が何か月あるかを、担当者ごとに数えたい場合は次のように書けます。

=BYROW(B2:D6, LAMBDA(r, SUM(–(r>=100))))

r>=100で各月がTRUEかFALSEかを判定し、「–」で1と0に変換してからSUMで合計しています。

行の文字列を連結する

数値の集計だけでなく、文字列の処理にも使えます。たとえばA列に都道府県、B列に市区町村、C列に番地が入っている場合、次の数式で行ごとに1つの住所にまとめられます。

=BYROW(A2:C6, LAMBDA(r, TEXTJOIN(“”, TRUE, r)))

TEXTJOIN関数の第2引数をTRUEにすると、空白のセルを無視して連結します。

複数の計算を組み合わせる

LAMBDA関数の中には、1つの結果を返す式であれば組み合わせた計算も書けます。たとえば、行ごとの最大値と最小値の差を求めるには次のようにします。

=BYROW(B2:D6, LAMBDA(r, MAX(r)-MIN(r)))

担当者ごとに、月ごとの売上の振れ幅を確認したいときに役立ちます。

エラーが出たときの確認ポイント

BYROW関数でエラーが表示された場合は、次の点を確認してみましょう。

  • #VALUE!エラー:LAMBDA関数の書き方が正しくない場合や、パラメーターの数が合っていない場合に表示されます。BYROW関数に渡すLAMBDA関数は、1行分のデータを受け取るパラメーターを1つだけ持つ形にします。
  • #CALC!エラー:LAMBDA関数を指定していない場合や、LAMBDA関数が1つの値ではなく複数の値を返している場合に表示されます。たとえば、LAMBDA関数の中で行全体をそのまま返したり、配列を返す計算をしたりすると、このエラーになります。
  • #SPILL!エラー:結果を表示する予定のセル範囲に、すでに値が入力されていると表示されます。結果が広がる範囲を空けてから、もう一度確認します。

使いこなしのコツ

まず1行分の数式で動作を確かめる

複雑な計算をLAMBDA関数に入れる前に、1行分の範囲(たとえばB2:D2)に対して通常の数式で計算し、期待どおりの結果になるかを確かめておくと安心です。正しく動く式をLAMBDA関数の中に移せば、BYROW関数で失敗したときに原因を切り分けやすくなります。

パラメーター名はわかりやすく付ける

LAMBDA関数のパラメーター名は自由に決められます。「r」のような短い名前でも動きますが、「売上行」のように内容がわかる名前にすると、あとから数式を読み返すときに意味をつかみやすくなります。なお、パラメーター名にピリオド(.)は使えません。

範囲は少し広めに取るか、テーブルを使う

データの行が増える表では、第1引数の範囲をデータ行に合わせて更新する必要があります。表をテーブルに変換し、構造化参照で範囲を指定すると、行を追加したときに参照範囲も合わせて広がるため、管理がしやすくなります。

よく使う計算は名前を付けて再利用する

同じLAMBDA関数を複数の場所で使う場合は、[数式]タブの[名前の管理]からLAMBDA関数に名前を付けて登録できます(Mac版では[名前の定義]を使います)。登録した名前はブック内で関数のように呼び出せるので、BYROW関数の数式も短く読みやすくなります。

従来の方法と使い分ける

BYROW関数は、行ごとの結果を1つの数式でまとめて出したいときに向いています。一方で、ほかの人とファイルを共有する場合、相手のExcelがBYROW関数に対応していないと正しく計算されないことがあります。共有先の環境がわからないときは、従来どおり1行ずつの数式をコピーする方法を選ぶのも1つの判断です。

まとめ

ExcelのBYROW関数を使うと、表の各行に同じ計算を当てはめ、行ごとの結果を1つの数式で求められます。ポイントを振り返ります。

  • 書式は=BYROW(範囲, LAMBDA(名前, 計算))
  • LAMBDA関数の中の関数を入れ替えるだけで、合計・最大値・平均などに切り替えられる
  • 条件付きの件数や文字列の連結など、1つの値を返す計算なら幅広く使える
  • #VALUE!はLAMBDA関数の書き方、#CALC!は返す値の数、#SPILL!は表示先の空きを確認する
  • テーブルや名前の登録と組み合わせると、数式を管理しやすくなる

行ごとの集計を毎回コピーして作っている表があれば、BYROW関数で1つの数式にまとめられないか試してみてください。