ExcelのBYCOL関数の使い方|列ごとに関数適用

スポンサーリンク

毎月の集計表で、列ごとに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の理解が一気に進みます。コピペ集計から卒業して、スピル時代のスマートな集計術を自分の武器にしていきましょう。

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