REDUCE関数で累計を求めようとして、「最終値しか返らない」と困ったことはありませんか。
そんなときに使えるのがSCAN関数です。各ステップの計算結果を配列でまとめて返してくれます。
この記事では、SCAN関数の構文とREDUCEとの違い、累計売上・残高推移への活用例を解説します。
SCAN関数とは?
SCAN関数(読み方:スキャン)は、配列の各要素を順番に処理して累積値を求める関数です。関数名は「SCAN(走査する)」に由来します。
一言で言うと「REDUCEの中間結果版」です。
REDUCEは処理が終わった後の最終値だけを返します。SCANは各ステップの計算結果をすべて配列で返します。この違いが、2つの関数を使い分けるポイントです。
対応バージョン: Microsoft 365 / Excel 2024以降
Excel 2021ではSCAN関数は使用できません。お使いのバージョンをご確認ください。
SCAN関数の基本構文と引数の意味
=SCAN(初期値, 配列, LAMBDA(アキュムレータ, 値, 計算式))
引数は3つです。順番に確認しましょう。
第1引数:初期値
累積処理の開始値を指定します。
| 用途 | 初期値 |
|---|---|
| 合計・累計 | 0 |
| 積(かけ算) | 1 |
| 残高推移 | 初期残高(例: 100000) |
| 文字列連結 | “”(空文字) |
省略した場合は0として扱われます。
第2引数:配列
処理対象の配列や範囲を指定します。縦・横どちらの範囲でも指定できます。
第3引数:LAMBDA(アキュムレータ・値・計算式)
LAMBDAには2つのパラメータを指定します。
- アキュムレータ(a): 前ステップまでの累積値
- 値(v): 配列の現在の要素
この2つを使って、次の累積値を返す計算式を書きます。
REDUCEとの違いを比較する
SCAN関数とREDUCE関数は、構文がほぼ同じです。戻り値の形が違います。
詳しくはExcelのREDUCE関数の使い方|配列を1つの値に集約する方法をご覧ください。
戻り値の違い(スカラー vs 配列)
| 比較項目 | REDUCE | SCAN |
|---|---|---|
| 戻り値 | 最終値のみ(1セル) | 全ステップの中間値(配列) |
| 結果サイズ | 単一セル | 入力配列と同じサイズ |
| 主な用途 | 合計・最大値など | 累計・残高推移など |
たとえば、B2:B6に{10, 20, 30, 40, 50}が入っているとします。
REDUCEを使うと結果は150の1セルです。SCANを使うと結果は{10, 30, 60, 100, 150}の5セルです。
どちらを使うべきか?
| 欲しいもの | 使う関数 |
|---|---|
| 最終的な合計・集計値 | REDUCE |
| 各時点の累計・残高推移 | SCAN |
最終結果だけほしい場合はREDUCEを、途中経過も一覧にしたい場合はSCANを使ってください。
基本例:累計売上を求める
B2:B13に月別の売上が入っているとします。C2セルに以下の数式を入力します。
=SCAN(0, B2:B13, LAMBDA(a, v, a+v))
| 引数 | 値 | 意味 |
|---|---|---|
| 初期値 | 0 | 累計の開始値(1月末累計 = 1月売上) |
| 配列 | B2:B13 | 月別売上の範囲 |
アキュムレータ a | — | 前月までの累計 |
値 v | — | 現在月の売上 |
| 計算式 | a + v | 今月末累計 = 前月累計 + 今月売上 |
結果はC2:C13に自動展開(スピル)されます。
| 月 | 売上 | 累計売上 |
|---|---|---|
| 1月 | 100,000 | 100,000 |
| 2月 | 80,000 | 180,000 |
| 3月 | 120,000 | 300,000 |
各月末時点の累計がひと目でわかる表になります。
NOTE
スピルエラーに注意: 展開先(C2:C13)に別のデータが入っていると
#SPILL!エラーになります。展開先を空にしておいてください。
応用例:残高推移を一覧で表示する
初期残高を100,000円、入出金データをC2:C10に入力しているとします。D2セルに以下の数式を入力します。
=SCAN(100000, C2:C10, LAMBDA(残高, 取引, 残高+取引))
| 引数 | 値 | 意味 |
|---|---|---|
| 初期値 | 100000 | 初期残高(円) |
| 配列 | C2:C10 | 入出金範囲 |
アキュムレータ 残高 | — | 前時点の残高 |
値 取引 | — | 現在の入出金額 |
| 計算式 | 残高 + 取引 | 取引後の残高 |
| 日付 | 入出金 | 残高 |
|---|---|---|
| 4/1 | +50,000 | 150,000 |
| 4/3 | -30,000 | 120,000 |
| 4/5 | +20,000 | 140,000 |
NOTE
入力規則: 入金はプラス値、出金はマイナス値で入力してください。
LAMBDAのパラメータに残高・取引のような日本語名を使うと、数式の意図が読み取りやすくなります。
よくある間違いと注意点
初期値を省略するとどうなる?
初期値を省略すると0が使われます。累計や合計では問題ありません。
積(かけ算)の場合は要注意です。初期値が0だと最初のステップの結果が0になります。そのため以降の計算もすべて0になります。積を計算するときは必ず1を初期値に指定してください。
LAMBDAのパラメータは2つ必要
LAMBDAに指定するパラメータが1つや3つ以上だと#VALUE!エラーになります。「アキュムレータ」と「値」の2つセットで指定してください。
=SCAN(0, A1:A5, LAMBDA(a, v, a+v)) ' 正しい(パラメータ2つ)
=SCAN(0, A1:A5, LAMBDA(v, v+1)) ' エラー(パラメータ1つ)
対応バージョン(Microsoft 365 / Excel 2024以降)
| バージョン | 対応 |
|---|---|
| Microsoft 365 | ○ |
| Excel 2024 | ○ |
| Excel 2021 | x |
| Excel 2019以前 | x |
Excel 2021ではLAMBDA関数自体は使えます。ただしSCANなどのLAMBDAヘルパー関数は対応していません。
エラー一覧
| 状況 | エラー |
|---|---|
| LAMBDAのパラメータ数が2以外 | #VALUE! |
| 不正なLAMBDAを指定した場合 | #VALUE! |
| 展開先に既存データがある場合 | #SPILL! |
| 空の配列を渡した場合 | #CALC! |
まとめ:SCAN関数はこんな場面で使う
SCAN関数は配列を累積処理して各ステップの結果を配列で返す関数です。
| 場面 | 使う関数 |
|---|---|
| 最終的な合計だけほしい | REDUCE |
| 各時点の累計・残高推移がほしい | SCAN |
| 各要素を変換して同サイズで返したい | MAP |
| 行ごとに集約したい | BYROW |
| 列ごとに集約したい | BYCOL |
REDUCE・MAP・BYROW・BYCOLと組み合わせて使うことで、複雑な配列処理も実現できます。
関連記事:
