エクセル入門
SCAN関数(配列にLAMBDAを適用し各中間値を返す)

Excelの初心者向け入門解説
公開日:2022-10-19 最終更新日:2025-10-11

SCAN関数(配列にLAMBDAを適用し各中間値を返す)


SCAN関数はOffice365のExcelに2022年になってから追加された新しい関数です。
SCAN関数はLAMBDAヘルパー関数(LAMBDAと一緒に使う)の一つです。


配列にLAMBDAを適用して、各要素の計算結果を次の要素のLAMBDAアキュムレーターに渡しつつ出力配列を作成していきます。
中間値ではなく、累積値を出力する場合はSCAN関数を使います。
・MAP関数とSCAN関数とREDUCE関数の使い分け ・REDUCE関数の構文 ・REDUCEの基本動作 ・REDUCE関数の使用例と解説 ・初期値に配列を指定した場合 ・[初期値]を省略した時の動作

SCAN関数はLAMBDAヘルパー関数なので、LAMBDAについては別途習得してからお読みください。

LAMBDA以降の新関数について
・LAMBDA関数とLAMBDA関数を引数に指定できるヘルパー関数群 ・TEXT処理関数 ・配列操作関数群
LAMBDA関数(カスタム関数の作成)
・LAMBDA関数の構文 ・LAMBDA関数をセルで使う場合の基本 ・LAMBDA関数の「数式の検証」について ・LAMBDA関数をセルで使う場合の使用例 ・パラメーターの省略について ・LAMBDA関数を名前定義に登録 ・再帰関数の作成 ・LET関数内でLAMBDA関数を使用する ・LAMBDA関数にLAMBDA関数を渡す ・LAMBDA関数のネストと変数のスコープ(適用範囲) ・遅延評価によりLAMBDA関数オブジェクト(関数値)を返すことができる関数 ・LAMBDAヘルパー関数について


MAP関数とSCAN関数とREDUCE関数の使い分け

MAP関数、SCAN関数、REDUCE関数は一見よく似ていますが、役割はそれぞれ異なります。
この3つを区別するポイントは 「要素数が変わるかどうか」 と 「前の要素に依存するかどうか」 の2つです。
  • MAP関数は、入力リストと出力リストの行数が変わらないときに使います。各要素の処理が独立しており、他の要素に影響されない場合に最適です。
  • SCAN関数は、入力と出力の行数が変わらず、かつ各要素の処理が前の要素の結果に依存するときに使います。処理の途中経過をすべて記録したい場合に役立ちます。
  • REDUCE関数は、入力リストと出力リストの行数が変わるときに使います。リスト全体を1つの値に集約したり、条件に基づいて新しいリストを生成したりする際に用います。
  • BYROW関数は、配列の各行に同じ処理を適用し、行ごとに結果を返すときに使います。行単位での集計や変換に最適です。
  • BYCOL関数は、配列の各列に同じ処理を適用し、列ごとに結果を返すときに使います。列単位での集計や変換に最適です。
この5つの関数は、入出力の行数の変化と処理の依存性という観点と、、行ごと処理・列ごと処理で使い分けることができます。

使い分け簡易フローチャート
MAP関数、SCAN関数、REDUCE関数、BYROW関数、BYCOL関数の使い分け

まとめと使い分けの早見表
関数 目的 入力と出力の関係 処理の依存性
MAP関数 各要素の変換 入力リストと出力リストの要素数が同じ 独立 各要素を2倍にする、大文字に変換する
REDUCE関数 1つの値への集約 入力リストから単一の値 累積的(前の結果に依存) 合計、最大値、平均
SCAN関数 累積結果の履歴 入力リストと出力リストの要素数が同じ(経過リスト) 累積的(前の結果に依存) 累積和、残高の推移
BYROW関数 各行の集計・変換 入力の行数と出力の行数が同じ(列数は不問) 独立(行間で影響しない) 行ごとの合計、平均、最大値
BYCOL関数 各列の集計・変換 入力の列数と出力の列数が同じ(行数は不問) 独立(列間で影響しない) 列ごとの合計、平均、最大値


SCAN関数の構文

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

[初期値] アキュムレーターの開始値を設定します。
省略可能:挙動については注意が必要、最後に解説しています。
配列 配列を指定します。
単一データ(スカラー型、定数値)の指定も可能ですが使用する意味はありません。
必須です。
LAMBDA 配列をスキャンするために呼び出されるLAMBDA。
LAMBDAは2つのパラメーターと計算が必要です:。

LAMBDA
アキュムレーター その時点の中間値を受け取ります。
配列内の各要素から受け取る値。
計算 スキャンした時の計算式

アキュムレーターとは
論理演算や四則演算などによるデータの入出力と結果の保持に用いられるレジスタのことです。

LAMBDAでは計算結果を返します。
LAMBDAで計算された値は、
・配列の各要素と同じ位置に格納されます。
・次の配列要素で呼ばれるLAMBDAがアキュムレーターで受け取ります。
これを配列の全ての要素に対して行います。
この下で詳しく説明します。


SCANの基本動作

Excel エクセル SCAN関数 LAMBDA

数式
=SCAN(0,A1:A5,LAMBDA(x,y,x+y))
解説

Excel エクセル SCAN関数 LAMBDA

SCANは入力の配列と同じ大きさの出力配列を最初に用意すると考えてください。
A1:A5を順に処理します。
A1:A5の1,2,3,4,5が順にLAMBDAyに入ります。
最初は{1,2,3,4,5}1が取り出され、初期値の00+1=1が計算され、この1が取り出した配列と同じ位置(1行)の出力配列に格納され、さらにこの値は次のLAMBDAに渡されます。
次に{1,2,3,4,5}2が取り出され、前回の11+2=3が計算され、この3が取り出した配列と同じ位置(2行)の出力配列に格納され、さらにこの値は次のLAMBDAに渡されます。
これが配列の最後まで行われ、配列の全ての処理が終わった時の出力配列がSCANの戻り値となります。

Excel エクセル SCAN関数 LAMBDA


SCAN関数の使用例と解説

例題
500円玉貯金をすることにしました。
月曜は500円、火曜は1,000円、水曜は1,500円、木曜は2,000円、金曜は2,500円
土日は貯金はしません。
開始日と終了日を入力し、その貯金額の推移を出力してください。

Excel エクセル SCAN関数 LAMBDA
※E:Fは推移が分かり易いように検算を兼ねた数式を入れたものです。

数式
=LAMBDA(開始日,終了日,
LET(
期間,SEQUENCE(終了日-開始日+1,1,開始日),
SCAN(0,期間,LAMBDA(x,y,LET(w,WEEKDAY(y,2),x+500*IF(w<6,w,0))))
))(A1,A2)
解説
LET関数内の変数「期間」は、開始日から終了日までの日付の一覧です。E列と同じものを作り出しています。
つまり、日付の一覧(ここではE1:E14)があるなら、数式は、
=SCAN(0,E1#,LAMBDA(x,y,LET(w,WEEKDAY(y,2),x+500*IF(w<6,w,0))))
これだけになります。

日付の一覧から順次SCANで取り出します。
取り出した日付の曜日をWEEKDAYで求めます。WEEKDAY(...,2)は1月曜~7日曜です。
曜日が<6、つまり金曜日までなら、その曜日数値*500、土日は0を順次加算していきます。
配列を順次処理しつつ、その途中結果は出力配列に格納され、最終的な出力配列がSCANの結果となります。

REDUCE関数の例題と同一問題にしています。
・MAP関数とSCAN関数とREDUCE関数の使い分け ・REDUCE関数の構文 ・REDUCEの基本動作 ・REDUCE関数の使用例と解説 ・初期値に配列を指定した場合 ・[初期値]を省略した時の動作
REDUCEとの動作の違いを把握してください。


[初期値]を省略した時の動作

以下の動作については、「Officeのサポート REDUCE関数」には書かれていない関数仕様になります。
したがって、[初期値]は省略せずに使う事をお勧めします。

[初期値]を省略した場合は、配列の最初(1番目)を初期値として、配列の2番目から順に処理していきます。
見方を変えれば、
1番目に呼ばれるLAMBDAは何も計算を行わずに配列の一番目の値を返していることと同じ意味です。

=SCAN(,{1,2,3},LAMBDA(x,y,x+y+100))
この結果は、{1,103,206}となります。
=SCAN(,{1,2,3},LAMBDA(,1,初期値なしはそのまま配列の1を返す)) ・・・ {1, , }
=SCAN(,{1,2,3},LAMBDA(1,2,1+2+100)) ・・・ {1,103, }
=SCAN(,{1,2,3},LAMBDA(103,3,103+3+100)) ・・・ {1,103,206}
={1,103,206}

初期値を指定した場合は、もちろん普通に実行されます。
=SCAN(0,{1,2,3},LAMBDA(x,y,x+y+100))
この結果は「306」となります。
=SCAN(0,{1,2,3},LAMBDA(0,1,0+1+100)) ・・・ {101, , }
=SCAN(0,{1,2,3},LAMBDA(101,2,101+2+100)) ・・・ {101,103, }
=SCAN(0,{1,2,3},LAMBDA(203,3,203+3+100)) ・・・ {101,103,206}
={101,203,306}


LAMBDA以降の新関数の問題集 ・・・ 解答は別ページになっています。

・目次 ・LAMBDA踊るぞ編 ・LAMBDA踊るぞ編2 ・SCAN編 ・MAP編 ・REDUCE編 ・山手線営業の旅編 ・BYROW,BYCOL編 ・ここからはフリー問題だよ編 ・好きな関数を使ってくれ編 ・いろんな関数を使ってね編 ・魔球編 ・豚が木に登れば落ちることもある編 ・たまには100点とってみたいものだ編 ・これは何と言う処理なんだろ編 ・数字は嫌いなのだ編 ・外堀から埋めていくぞ編 ・なぜわざわざそうしたいのか編 ・かっこつけてんじゃないよ編 ・頭の体操だけど新関数の出番はあるか?編 ・定番だけど出してなかったよね編
LAMBDA以降の新関数の使用例
・2つの1次元配列から、それをクロス結合した結果を返す ・A列が同じ行のB列の値を連結して、A列の一意な値とともに出力 ・名前定義を使わずにLAMBDA関数で再帰する方法 ・文字列を大文字小文字変換して大小文字の全組み合わせを出力 ・2つのテーブルの片方しかない行を縦に連結出力 ・3連単、3連複のフォーメーション買目を全て列挙する ・FILTER関数の出力行数・列数を指定する ・月が縦で日が横の表を、曜日(7列)で縦に折り返す ・文字列内の括弧()()の中の文字を取り出して列挙 ・表内にあるセル内改行を複数行に展開 ・文字列の中から1文字削除の全パターン出力 ・クロスABC分析 ・月利が毎月変動する月複利の計算 ・レーベンシュタイン距離 ・文字列を数字と数字以外で分割 ・縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS) ・直積(クロス結合、…




同じテーマ「エクセル入門」の記事

LAMBDA関数(カスタム関数の作成)
MAP関数(配列各値を新しい値にマッピングした配列を返す)
REDUCE関数(配列にLAMBDAを適用し累積値を返す)
SCAN関数(配列にLAMBDAを適用し各中間値を返す)
BYROW関数(配列の行単位にLAMBDAを適用し列を集約)
BYCOL関数(配列の列単位にLAMBDAを適用し行を集約)
ISOMITTED関数(LAMBDAの引数省略の判定)
MAKEARRAY関数(行数・列数で計算した配列を作成)
VSTACK関数(配列を縦方向に順に追加・結合)
HSTACK関数(配列を横方向に順に追加・結合)
CHOOSEROWS関数(配列から複数の指定された行を返す)


新着記事NEW ・・・新着記事一覧を見る

SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出|SQL入門(2025-11-02)
SQL基礎問題5:複数のマスタテーブルの結合|SQL入門(2025-11-01)
SQL基礎問題4:2つのテーブルの不一致を抽出|SQL入門(2025-10-29)
SQL基礎問題3:文字列の一部をキーにして集計|SQL入門(2025-10-29)
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出|SQL入門(2025-10-28)
SQL基礎問題1:最大在庫数を持つ製品の在庫金額|SQL入門(2025-10-28)
「ADO + VBA」でSQLを実行するときのVBAサンプル|SQL入門(2025-10-28)


アクセスランキング ・・・ ランキング一覧を見る

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ