ADVERTISEMENT

【Googleスプレッドシート】SCAN関数で累計を計算!累計を別セルに展開する手順

【Googleスプレッドシート】SCAN関数で累計を計算!累計を別セルに展開する手順
🛡️ 超解決

売上や在庫のデータで「ここまでの合計」を出したい場面はよくあります。これまではSUM関数を範囲指定で下にドラッグする方法や、SUM+ROW関数を組み合わせた方法が一般的でした。しかし、データの行数が増えるたびに数式を更新する必要があり、手間がかかるものです。GoogleスプレッドシートのSCAN関数を使えば、配列内を1行ずつ走査しながら累計を自動計算し、その結果を隣の列に一発で展開できます。この記事では、SCAN関数の基本的な使い方から実践的な応用例までをわかりやすく解説します。

【要点】SCAN関数で累計計算を自動化する3つのポイント

  • SCAN関数の基本構文: =SCAN(初期値, 配列, ラムダ関数) で累計を計算します。初期値に0を指定し、配列に数値列を、ラムダ関数で acum+value と書くことで累積和を出力します。
  • 従来のSUM+ROW方式との違い: 数式を1つセルに入力するだけで、配列全体の結果が自動的に下方向に展開されます。行の追加・削除にも自動対応するため、メンテナンスが格段に楽になります。
  • 応用範囲の広さ: 条件付き累計や累積最大値、文字列の連結など、初期値とラムダ関数を変えるだけで多様な累積演算に使えます。

ADVERTISEMENT

SCAN関数の概要と従来の累計計算との違い

SCAN関数は、Googleスプレッドシートの配列関数のひとつで、指定された配列の各要素に対して左から右へ順に処理を実行し、その途中経過の値をすべて出力します。累計計算の場合、初期値として0を設定し、各セルの値を前の累計に加算していくことで、動的に累計の配列を生成します。

これまで累計を計算するには、SUM関数とROW関数を組み合わせた「=SUM($A$2:A2)」のような数式を最下行までコピーする方法が一般的でした。この方法では、データ行が増えるたびに数式のコピー範囲を手動で拡張する必要があります。また、フィルターで行が隠れた場合にも影響を受けることがあります。SCAN関数はセル1つに数式を入力するだけで、隣接するセルに自動的に結果がスピルするため、これらの問題を解決します。

SCAN関数は2022年のアップデートで利用可能になった比較的新しい関数です。対応バージョンでない場合は、従来方法か別の関数(例えば、ARRAYFORMULAとSUMIFの組み合わせなど)を検討する必要があります。また、SCAN関数はラムダ関数(LAMBDA)を引数に取るため、少し学習コストがありますが、一度理解すれば再利用性の高いコードになります。

SCAN関数で累計を計算する具体的な手順

ここでは、A列に売上データがA2からA10まで入力されているシートを例に、B列に累計を表示する手順を説明します。結果はB2セルに入力した数式から下方向に自動展開されます。

基本の累計計算(単純な累積和)

  1. セルB2を選択する
    累計の結果を表示させたい最初のセル(B2)をクリックします。
  2. SCAN関数を入力する
    次の数式を入力します:=SCAN(0, A2:A10, LAMBDA(acum, value, acum+value))。この数式は、初期値0から始めて、A2からA10の各値valueを、それまでの累計acumに加算していきます。
  3. 結果が自動展開されるのを確認する
    Enterキーを押すと、B2セルにA2の値が表示され、B3以降に自動的に累計がスピル表示されます。スピル範囲はB2:B10になります。

これで、A列に新しいデータを追加すれば、SCAN関数の配列範囲を調整するか、範囲を広めに取ることで自動反映されます。例えば、範囲をA2:A100としておけば、データが増えても再設定は不要です。

行が増えた場合の自動対応

SCAN関数の素晴らしい点は、配列範囲を広めに指定しておけば、データが追加されても数式を更新する必要がないことです。A2:A100のように余裕を持った範囲を指定しておけば、A11以降に数値を入力しても、B11以降に自動的に累計が計算されます。ただし、空のセルがある場合は、その行の累計は前の行と同じ値になる(0を加算する)ため、特に問題はありません。

条件付き累計(特定の条件を満たす行のみ累計)

  1. IF関数と組み合わせる
    例えば、A列に金額、B列に「売上」や「返金」などの区分がある場合、区分が「売上」のときだけ累計に加算するには、=SCAN(0, A2:A10, LAMBDA(acum, value, IF(B2:B2="売上", acum+value, acum)))のような数式は正しく動作しません。理由はラムダ関数の引数valueが配列の1要素ずつですが、条件列を参照するにはインデックスを使う必要があるためです。
  2. 正しい方法:FILTERと組み合わせる
    まずFILTER関数で条件に合う行だけを抽出し、その配列に対してSCANを適用します。ただし、その場合、結果の行数が元のデータと一致しないため、別の工夫が必要です。より実用的な方法は、ARRAYFORMULAとSUMIFを使うことです。SCAN関数で条件付き累計を実現するのは少し複雑ですが、以下の方法で可能です:
  3. SCANとOFFSETを使う高度な方法
    セルC2に =SCAN(0, A2:A10, LAMBDA(acum, value, acum+IF(INDEX(B2:B10,ROW(value)-ROW(A2)+1)="売上", value, 0))) と入力します。この数式では、ラムダ関数内でINDEXを使って現在の行の区分セルを参照し、条件判定を行います。少し難解ですが、うまく動作します。

条件付き累計が必要な場合は、最初からQUERY関数やSUMIFSで計算するほうがシンプルなケースも多いです。SCAN関数は単純な累積和や累積最大値など、演算が単純な場面で真価を発揮します。

SCAN関数使用時の注意点と制限事項

スピル範囲が自動で設定される

SCAN関数は結果を自動的に隣接セルにスピルします。そのため、スピル先のセルに既にデータが入力されていると、#REF!エラーが発生します。事前にスピル範囲を空にしておくか、既存のデータを削除してから数式を入力してください。

パフォーマンスに関する注意

SCAN関数を使用したワークシートは、大量のデータ(数千行以上)を扱うと計算が重くなる場合があります。特にラムダ関数内で複雑な処理を行うと、処理時間が増大します。そのような場合は、QUERY関数やピボットテーブルなど、他の方法も検討することをおすすめします。

範囲の変更への対応

SCAN関数の配列引数に固定範囲(A2:A10)を指定した場合、範囲外にデータを追加しても自動計算されません。常に増え続けるデータに対しては、範囲を十分広く取るか、オープン範囲(A2:A)を使うことを検討します。ただし、オープン範囲はシート全体をスキャンするため、空白行も処理対象になり、無駄な計算が発生する可能性があります。適切な上限を設定するか、データの最終行を動的に取得する工夫が必要です。

代替関数との比較

SCAN関数以外にも累計を計算する方法はいくつか存在します。目的や状況に応じて最適な方法を選びましょう。

ADVERTISEMENT

SCAN関数と従来手法の比較表

手法 数式の入力方法 データ追加時の対応 パフォーマンス 可読性
SCAN関数 1つのセルに数式を入力し、自動スピル 範囲を広めに指定すれば自動反映(範囲外は手動修正) データ量が多いとやや重い ラムダ関数に慣れが必要
SUM+ROW(ドラッグ) 最初のセルに数式を入力し、下にコピー 手動でコピー範囲を拡張する必要あり 非常に軽い シンプルでわかりやすい
QUERY関数 1つのセルにQUERY文を入力、スピル 範囲を広めに指定すれば自動反映 中程度。データ量に依存 SQLライクな構文で習得に時間がかかる
ARRAYFORMULA+SUMIF 1つのセルにARRAYFORMULAでラップ 範囲を広めに指定すれば自動反映 中程度。条件付きに強い ARRAYFORMULAの理解が必要

まとめ

SCAN関数を使えば、従来のドラッグ式の累計計算から解放され、動的でメンテナンスフリーなワークシートを構築できます。基本形は =SCAN(0, 数値範囲, LAMBDA(acum, value, acum+value)) と覚えておけば、すぐに実践で使えます。さらに、ラムダ関数の部分を工夫することで、累積最大値や文字列連結など、さまざまな累積演算に応用できます。まずはシンプルな累計から試して、その便利さを体感してください。次のステップとして、SCAN関数と同時に導入されたREDUCE関数やMAP関数にも挑戦すると、配列操作の幅がさらに広がります。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。