ADVERTISEMENT

【Googleスプレッドシート】SCAN関数で累計計算!途中経過の出力

【Googleスプレッドシート】SCAN関数で累計計算!途中経過の出力
🛡️ 超解決

スプレッドシートで累計(累積合計)を計算したい場面はよくあります。毎月の売上データや経費の累計を素早く求めたい時、通常はSUM関数と複数のセル参照を組み合わせる方法がありますが、数式が長くなりがちです。そんな時に役立つのがSCAN関数です。この関数を使うと、配列の各要素に対して累積計算を行い、途中経過を含む結果を一つの式で出力できます。この記事では、SCAN関数の基本的な使い方から累計計算への応用、注意点までを解説します。

【要点】SCAN関数で累計計算をスムーズに実現する方法

  • =SCAN(初期値, 配列, LAMBDA(累積, 現在値, 計算式)): 配列の各要素を順に処理し、累積値を更新しながら結果の配列を返します。
  • 累計合計の例: =SCAN(0, A2:A10, LAMBDA(acc, val, acc+val)) でA2からA10の累計を一発計算します。
  • 途中経過の出力: SCANは各ステップの途中結果をすべて保持するため、累計の推移を配列で取得できます。

ADVERTISEMENT

SCAN関数の仕組みと基本構文

SCAN関数は配列を受け取り、その各要素に対してLAMBDA関数で定義した計算を繰り返し適用する関数です。計算のたびに累積値(アキュムレータ)が更新され、その途中経過がすべて配列として返されます。つまり、最終結果だけでなく、そこに至るまでの各ステップの値も出力されるのが大きな特徴です。

基本構文は次の通りです。

=SCAN(初期値, 配列, LAMBDA(アキュムレータ, 現在値, 計算式))

初期値は計算の出発点となる値、配列は処理したいセル範囲、LAMBDAの中ではアキュムレータ(累積値)と現在値を使って計算式を記述します。この関数はスピル機能に対応しているため、一つのセルに入力するだけで結果の配列が隣接するセルに自動的に展開されます。

例えば、セルA1に「0」、A2に「1」、A3に「2」、A4に「3」が入力されているとき、
=SCAN(0, A1:A4, LAMBDA(acc, x, acc+x)) と入力すると、結果は {0, 1, 3, 6} のように累計が表示されます。最初の0は初期値のまま、次に1を足して1、さらに2を足して3、最後に3を足して6となるためです。

SCAN関数で累計計算を行う具体的な手順

ここでは、月別売上データを使った累計計算の例を紹介します。以下の手順で進めてください。

基本的な累計計算

  1. データを用意する
    A列に月名(任意)、B列に売上金額を入力します。例えばB2:B13に各月の売上を入力します。
  2. SCAN関数を入力するセルを決める
    C2セルなど、結果を表示したい場所を選択します。
  3. SCAN関数を入力する
    次の数式を入力します。
    =SCAN(0, B2:B13, LAMBDA(acc, val, acc+val))
    初期値を0、配列を売上範囲、LAMBDAで単純な加算を行います。
  4. 結果を確認する
    セルC2に数式を入力すると、C2からC13に累計が自動的に展開されます。最初の行(C2)は初期値0にB2を足したB2の値、C3はB2+B3、以下同様に累計が表示されます。

条件付き累計(IF関数との組み合わせ)

特定の条件を満たす行のみ累計に含めたい場合、LAMBDA内でIFを使って制御します。例えば、売上が100以上の月だけ累計する場合です。

  1. 条件を追加したLAMBDAを用意する
    =SCAN(0, B2:B13, LAMBDA(acc, val, IF(val>=100, acc+val, acc)))
    valが100以上なら加算、それ以外は前の累積値をそのまま保持します。
  2. 数式を入力して結果を確認する
    C2セルに入力すると、条件を満たした行だけ累計が更新され、それ以外は前の値が引き継がれます。

累計とともに元のデータも並べて表示

SCAN関数の結果はスピル範囲に出力されますが、元のデータと並べて確認したい場合は、隣の列にSCANを配置するだけです。あるいは、配列リテラルを使って一つの数式で元データと累計をまとめて表示することもできます。

  1. 元データと累計を横に並べる数式
    ={B2:B13, SCAN(0, B2:B13, LAMBDA(acc, val, acc+val))}
    この数式はB列の売上とC列の累計を一度に出力します。{}で囲むことで配列を横に結合します。
  2. 入力場所の注意
    上記数式は任意のセルに入力しますが、結果は2列分の幅を占めるため、隣接セルにデータがないことを確認してください。

SCAN関数を使う際の注意点と制限事項

SCAN関数は非常に便利ですが、いくつか注意すべき点があります。以下に主なポイントをまとめます。

スピル範囲が正しく確保されていない場合

SCAN関数は結果をスピルで出力します。そのため、結果が出力される範囲に他のデータが存在すると、#SPILL!エラーが発生します。事前に出力先のセルが空であることを確認するか、既存のデータを移動してください。

大量のデータでのパフォーマンス

SCAN関数は配列の要素数だけLAMBDAを繰り返し計算するため、データ量が非常に多い場合(数万行など)は計算に時間がかかる可能性があります。その場合は、QUERY関数やピボットテーブルなど他の方法も検討してください。

非推奨: 複雑なLAMBDAで可読性を損なわない

LAMBDAの中に複数のIFや他の関数を入れ子にすると、数式が読みにくくなることがあります。必要に応じて名前付き関数(名前付きLAMBDA)を活用するか、補助列を使うなどシンプルな構成を心がけてください。

初期値とデータ型の一致

初期値と配列の要素のデータ型が異なると、予期しない結果になることがあります。例えば、初期値を数値の0、配列を文字列の数字にするとエラーになります。必ず数値同士またはテキスト同士で統一してください。

ADVERTISEMENT

SCAN関数とREDUCE関数の違い

SCANとよく似た関数にREDUCEがあります。両者の違いを以下の表で比較します。

項目 SCAN関数 REDUCE関数
返り値 各ステップの途中結果を含む配列 最終結果のみ(単一の値)
用途 累計の推移や途中経過をすべて確認したい場合 合計値や最終的な累積値だけが必要な場合
構文の違い =SCAN(初期値, 配列, LAMBDA) =REDUCE(初期値, 配列, LAMBDA)
出力のサイズ 配列(配列の要素数と同じ行数) 単一セル
スピル 自動的にスピル スピルしない(単一値)

このように、SCANは各段階の途中値を追跡できるため、累計計算や移動平均などの中間結果を可視化したい場合に適しています。一方、REDUCEは最終的な集計値だけが必要な場合に便利です。

まとめ

SCAN関数を使うと、従来は複数のSUM式やSUMIFSが必要だった累計計算を一つの数式で実現できます。特に途中経過を配列として取得できる点が最大の強みで、データの推移を動的に確認したい場面で威力を発揮します。この記事で紹介した基本構文をベースに、IFや他の関数と組み合わせることで条件付き累計や複雑な集計も可能です。ぜひ実際のスプレッドシートで試しながら、SCAN関数を活用してみてください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

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