毎月の集計表で、列ごとにSUM関数をコピペしていませんか。列数が増えるたびに数式をコピーして、見た目は揃っていてもどこかで貼り間違いが発生する。そんな地味な作業に時間を奪われるのはもったいないですよね。
もし1つの数式で「この表の各列の合計をまとめて出して」と指示できたらどうでしょうか。実はExcelのMicrosoft 365には、そのためのBYCOL関数という専用関数が用意されています。列単位で一気に集計を返してくれる、スピル時代ならではの便利な関数です。
この記事では、ExcelのBYCOL関数の使い方を基本から応用まで解説します。LAMBDA関数との組み合わせ方、#SPILL!エラーへの対処、BYROW関数との違い、さらにGoogleスプレッドシート版との差分まで、実務で詰まりやすいポイントを重点的に紹介します。
BYCOL関数とは?
ExcelのBYCOL関数は、配列の「列ごと」にLAMBDA関数を適用し、1行にまとめた結果を返す関数です。読み方は「バイコル」。「BY COLumn(列ごとに)」という名前の通り、表を縦方向に分割して各列を1つずつ処理するイメージで使います。
従来のExcelで列ごとの集計を行う場合、SUMやAVERAGEを列の数だけ横にコピーするのが一般的でした。BYCOL関数を使えば、1つの数式で「すべての列に同じ処理」を適用できます。結果はスピル(自動的に隣のセルへ展開される機能)で横方向に並ぶため、数式の管理箇所が1つに集約され、修正や検算の手間が大きく減ります。
戻り値の形状は「1行×N列」の配列です。たとえば2行×3列の表を渡せば、結果は1行×3列の配列として返ります。元データの「列の数」がそのまま結果の「セルの数」になる、と覚えておくと迷いません。
Microsoft 365専用・スプレッドシート版との違い
BYCOL関数はMicrosoft 365時代の新世代関数で、対応バージョンは限定的です。利用できる環境は次のとおりです。
- Excel for Microsoft 365 / Microsoft 365 for Mac
- Excel for the web
- Excel 2024 / Excel 2024 for Mac
Excel 2019やExcel 2021では使えない点に注意してください。
GoogleスプレッドシートにもBYCOL関数は存在し、基本構文は =BYCOL(配列または範囲, LAMBDA) でExcel版とほぼ同じです。「Sheetsで使っていた数式をそのままExcelに持ってきたい」というケースでも、ほぼ書き換えなしで動くのが嬉しいポイントです。ただしスピルの干渉エラーの出方や、Excelテーブル内では動的配列関数が機能しないなど、Excel特有の注意点があります。
詳しいSheets版の書き方は、自サイトのスプレッドシートのBYCOL関数の使い方も参考にしてください。両方の違いを押さえておくと、二重運用している環境でも迷わず使い分けられます。
BYROW関数(行版)との対比
BYCOL関数には「行版」とも言うべき兄弟関数、BYROW関数があります。BYROW関数は配列の「行ごと」にLAMBDAを適用し、「N行×1列」の配列を返します。「行はBYROW、列はBYCOL」と名前の頭文字で覚えると混乱しません。
| 観点 | BYCOL関数 | BYROW関数 |
|---|---|---|
| 処理の向き | 列ごと(縦のかたまりを処理) | 行ごと(横のかたまりを処理) |
| 戻り値の形 | 1行×N列 | N行×1列 |
| 典型用途 | 列ごとの合計・平均・最大値 | 行ごとの合計・平均・最大値 |
| スピル方向 | 横方向 | 縦方向 |
どちらもLAMBDA関数を使って「各列/各行にどんな処理を適用するか」を自由に指定できます。行ごとの集計が必要ならBYROW、列ごとの集計ならBYCOL、と目的に合わせて選び分けるだけです。
BYCOL関数の書き方
BYCOL関数は引数が2つだけのシンプルな構造ですが、第2引数にLAMBDAが必須という点だけは他の関数と毛色が違います。ここで構文を正確に押さえておきましょう。
構文と引数
BYCOL関数の基本構文は次のとおりです。
=BYCOL(array, lambda(column))
引数の意味は下の表で整理します。
| 引数 | 必須 | 役割 |
|---|---|---|
array | 必須 | 処理したい配列またはセル範囲。A1:C10のような長方形の範囲を渡す |
lambda(column) | 必須 | 各列に適用するLAMBDA関数。columnは1列分のデータを表す仮引数 |
array には通常のセル範囲だけでなく、他の関数が返す配列もそのまま渡せます。lambda(column) の column という名前は自分で好きな名前に変えても構いません。たとえば LAMBDA(col, SUM(col)) のように短い名前を使うと、数式が読みやすくなります。
LAMBDAを省略できない理由
「SUMだけを使いたいのだから、LAMBDAは省略したい」と思うかもしれません。しかしBYCOL関数では、第2引数のLAMBDAは省略できません。理由は、BYCOL関数自体が「何の処理をするか」を知らない汎用関数だからです。
BYCOL関数は「各列を順番にLAMBDAへ渡す」という役割しか持ちません。列ごとに何を計算するかはLAMBDAの中で決める必要があります。次の2つを見比べると違いが明確です。
=BYCOL(A1:C10, SUM)
上の書き方はNGです。SUMをLAMBDAで包まずに渡しているためエラーになります。正しくは次のように書きます。
=BYCOL(A1:C10, LAMBDA(col, SUM(col)))
LAMBDA(仮引数, 計算式) の形で必ず包んであげてください。
基本の使い方
ここからはBYCOL関数を使った基本的な集計パターンを紹介します。どれも実務の集計表で頻出するものばかりです。
列ごとにSUMを求める
まずは定番の「列ごとの合計」から。A1:C5に店舗別の売上が入っていて、各列(=各店舗)の合計を一発で出したい場合の数式は次のとおりです。
=BYCOL(A1:C5, LAMBDA(col, SUM(col)))
この数式をE1に入力すると、E1:G1の3セルに各列の合計がスピルで展開されます。列数が10や20に増えても、範囲を A1:T5 のように広げるだけでOKです。SUM関数をコピペする必要はありません。
Microsoft公式ドキュメントでは、各列の最大値を求める =BYCOL(A1:C2, LAMBDA(array, MAX(array))) が使用例として紹介されています。LAMBDAの仮引数名は array でも col でも動作は同じです。
列ごとにAVERAGE・MAXを求める
SUM以外の集計関数も同じ要領です。AVERAGEで平均、MAXで最大値、MINで最小値がそれぞれ1つの数式で取れます。
=BYCOL(A1:C5, LAMBDA(col, AVERAGE(col)))
=BYCOL(A1:C5, LAMBDA(col, MAX(col)))
=BYCOL(A1:C5, LAMBDA(col, MIN(col)))
これらを縦に並べて書けば、1つのセル範囲に「合計・平均・最大」を整然と出せます。従来なら関数を手で入力していた作業が、数式の使い回しで済むようになるのが最大のメリットです。
応用例
基本の使い方を押さえたら、実務でよく出てくる応用パターンにも挑戦してみましょう。BYCOL関数はLAMBDAの中身を自由に書けるため、組み合わせ次第で表現力がぐっと広がります。
BYCOL × IFで条件付き列集計
「各列のうち、100以上の値だけを合計したい」といった条件付き集計もBYCOL関数で実現できます。LAMBDAの中にIF関数を仕込み、条件を満たす要素だけをSUMに渡す形です。
=BYCOL(A1:C10, LAMBDA(col, SUM(IF(col>=100, col, 0))))
この数式は各列について「100以上ならその値、未満なら0」を返し、その合計を取ります。SUMIF関数は範囲と条件を直接指定する使い方が主流ですが、BYCOL内ではLAMBDAの仮引数を条件判定に使えるため、より柔軟な集計が組めます。
同じ考え方で、COUNTIFのように「条件に合う件数」を列ごとに数えることもできます。
=BYCOL(A1:C10, LAMBDA(col, SUM(--(col>=100))))
--(col>=100) は、TRUE/FALSEを1/0に変換する定番テクニックです。BYCOLと組み合わせると、列ごとの条件一致件数がスピルで一気に並びます。
複合計算(SUM÷COUNTなど)をネストする
LAMBDAの中では複数の関数をネストして自由に計算できます。たとえば「各列の平均を自前で計算したい」ときは、SUMとCOUNTを組み合わせる書き方が可能です。
=BYCOL(A1:C10, LAMBDA(col, SUM(col)/COUNT(col)))
単純な平均ならAVERAGEで十分ですが、分母と分子に別々の条件を絡めたいときに威力を発揮します。公式ドキュメントでは =BYCOL(A1:C2, LAMBDA(array, SUMSQ(array))) のように二乗和を求める例も紹介されています。通常の数式で書ける計算ならほぼ何でも詰め込める、と考えてOKです。
より複雑な式では、LET関数で中間変数を定義すると可読性が上がります。詳しくはExcelのLET関数の使い方もあわせて参照してみてください。
よくあるエラーと対処法
BYCOL関数は新しい関数のため、初めて触るときに独特のエラーに遭遇することがあります。公式ドキュメントに記載されている代表的なエラーと対処法をまとめました。
#SPILL!エラー|隣のセルが空白か確認
BYCOL関数の結果は横方向にスピルするため、結果が展開される領域が他のデータで埋まっていると #SPILL! エラーが発生します。Microsoft公式によれば、主な原因は次の3つです。
- スピル範囲に既存データが残っている
- スピル範囲に結合セルが含まれている
- Excelテーブル内で動的配列関数を使っている(テーブル内ではスピルが機能しない)
対処はシンプルで、スピル先のセルを空にすればOKです。エラーセルの横に表示される警告アイコンをクリックし、「妨害しているセルを選択」ボタンを押すと、原因となっているセルがハイライトされます。その位置のデータを退避するか、数式の入力位置を別の場所に変えましょう。
Excelテーブル内で使いたい場合は、一度テーブル外のセルに数式を書き、結果だけをテーブルに値貼り付けする運用がおすすめです。
LAMBDA引数ミス|引数の数が合わないとき
#VALUE! エラーや #CALC! エラーが出たときは、LAMBDA関数の書き方を見直します。公式ドキュメントでは次のように区別されています。
#VALUE!:無効なLAMBDA関数、またはLAMBDAのパラメータ数が正しくない(Incorrect Parameters)#CALC!:LAMBDA関数が提供されていない、またはLAMBDAが単一値以外を返している
典型的なミスは、LAMBDAの仮引数を増やしすぎるパターンです。BYCOL関数のLAMBDAは仮引数1つだけを受け取ります。LAMBDA(col, row, SUM(col)) のように引数を2つ書くと #VALUE! になります。
また #CALC! は、LAMBDAの中身が配列をそのまま返してしまった場合に出ます。SUMやAVERAGEのような集約関数で「1つの値」に畳み込む処理を必ず最後に置いてください。
バージョン非対応|M365以外で使えない場合
Excel 2019やExcel 2021でBYCOL関数を使おうとすると、関数名が認識されず #NAME? エラーになります。BYCOL関数はMicrosoft 365系とExcel 2024系でのみ使える新しい関数だからです。
バージョンが原因かどうかは、「ファイル」→「アカウント」画面で確認できます。製品名が「Microsoft 365」や「Excel 2024」になっていれば対応済みです。「Excel 2021」「Excel 2019」と表示される場合は、そのPC環境ではBYCOL関数自体が存在しません。
対応バージョンのPCで数式を書き、値貼り付けで共有するか、SUMを列ごとに並べる従来の書き方にフォールバックする必要があります。Microsoft 365にアップグレードできるならそれが最速の解決策です。
まとめ
ExcelのBYCOL関数は、列ごとの集計を1つの数式にまとめてくれる頼もしい関数です。SUM・AVERAGE・MAXなどの定番集計はもちろん、IFと組み合わせた条件付き集計や、SUM/COUNTを組み合わせたカスタム計算もLAMBDA内で自由に書けます。
ポイントを改めて整理すると次のとおりです。
- 構文は
=BYCOL(array, lambda(column))で、LAMBDAは省略不可 - 戻り値は「1行×N列」の配列(列数がそのまま結果のセル数になる)
- Microsoft 365・Excel 2024系でのみ動作。Excel 2021以前は
#NAME?エラー #SPILL!エラーはスピル先の空き・結合セル・テーブル内使用を疑う- 行ごとの集計が必要ならBYROW関数、列ごとならBYCOL関数で使い分ける
LAMBDA関数の書き方に不安があるなら、先にExcelのLAMBDA関数の使い方で基本構文を押さえておくとBYCOLの理解が一気に進みます。コピペ集計から卒業して、スピル時代のスマートな集計術を自分の武器にしていきましょう。
