SCAN 関数は、上から順に計算した途中の結果を全部並べる関数です。=SCAN(0,B2:B7,LAMBDA(a,v,a+v)) と書くと、売上の累計(1 行目まで、2 行目まで…の合計)が 1 つの式で縦に並びます。
累計を出すときに =SUM($B$2:B2) を下へコピーする代わりに使えます。この記事では、SCAN の書き方と、累計・残高・それまでの最大の出し方を、実際の Excel で確かめた結果で説明します。SCAN は Microsoft 365 の関数です。
SCAN 関数の書き方
=SCAN(はじめの値, 範囲, LAMBDA(a, v, 計算))
| 引数 | 意味 |
|---|---|
| はじめの値 | 計算のスタートの値(累計なら 0、残高なら最初の残高) |
| 範囲 | 上から順に使う値 |
| a | それまでの結果(1 つ前の行の結果) |
| v | いま使っている行の値 |
| 計算 | a と v で次の結果をどう作るか(累計なら a+v) |
LAMBDA の a と v は自分で付ける名前です。1 つ目が「それまでの結果」、2 つ目が「いまの値」になります。
1. 売上の累計を出す
はじめの値を 0 にして、それまでの合計(a)にいまの売上(v)を足していきます。
=SCAN(0,B2:B7,LAMBDA(a,v,a+v))

結果は 120・200・350・410・610・700 で、最後の 700 は売上の合計と同じです。ほかの累計の出し方は 累計(累積合計)を出す方法で説明しています。
2. 入出金から残高を出す
はじめの値を最初の残高(10,000)にすると、入金(+)と出金(-)を足していった残高になります。
=SCAN(10000,C2:C7,LAMBDA(a,v,a+v))

残高は 15,000 から始まり、最後は 12,100 になりました。家計簿や小口現金の出納帳に使えます。
3. それまでの最大を出す
計算を MAX(a,v) にすると、「それまでの最大」と「いまの値」の大きいほうが残っていきます。
=SCAN(0,B2:B7,LAMBDA(a,v,MAX(a,v)))

結果は 120・120・150・150・200・200 で、最高記録が更新された日だけ値が変わります。
4. 最後の結果だけでよいなら REDUCE
REDUCE は書き方が SCAN と同じで、途中を並べずに最後の結果だけを返します。
=REDUCE(0,B2:B7,LAMBDA(a,v,a+v))

結果は 700 の 1 つだけで、SCAN の最後の値と同じです。
【実機で検証】SCAN でつまずくところ

| ためしたこと | 式 | 結果 |
|---|---|---|
| SCAN の最後の値 | =TAKE(SCAN(0,SCAN!B2:B7,LAMBDA(a,v,a+v)),-1) | 700 |
| SUM で合計 | =SUM(SCAN!B2:B7) | 700 |
| 空白がある A12:A14 の累計の最後 | =TAKE(SCAN(0,A12:A14,LAMBDA(a,v,a+v)),-1) | 40 |
| 文字の「あ」がある B12:B14 の累計の最後 | =TAKE(SCAN(0,B12:B14,LAMBDA(a,v,a+v)),-1) | #VALUE! |
| LAMBDA の名前が 1 つだけ | =SCAN(0,SCAN!B2:B7,LAMBDA(a,a+1)) | #VALUE! |
SCAN の最後の値(700)は、SUM の合計(700)と同じでした。
途中に空白があると 0 として足され、10・(空白)・30 の累計の最後は 40 でした。文字の「あ」がまざると #VALUE! になりました。累計する列に文字が入っていないか確かめます。
LAMBDA の名前を 1 つしか書かないと #VALUE! になりました。SCAN の LAMBDA は、名前を必ず 2 つ(それまでの結果・いまの値)にします。
よくある質問
SCAN が使えない(#NAME?)ときは?
SCAN・REDUCE は Microsoft 365 の関数です。Excel 2021 以前では、=SUM($B$2:B2) を下へコピーして累計を出します。
LAMBDA の書き方がよく分からないときは?
LAMBDA は「名前を付けて、計算のしかたを書く」ものです。くわしくは LAMBDA関数の使い方で説明しています。
1 行ずつの合計を出したいときは?
縦の累計ではなく、横の 1 行ごとに合計したいときは BYROW 関数を使います。
あわせて読みたい:関連記事
ローン返済の利息と元金を分けるなら、IPMT・PPMT関数の使い方もあわせてご覧ください。

コメント