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

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

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


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


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

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

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


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関数の例題と同一問題にしています。
・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 ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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