はじめに
Excelでは通常、繰り返し処理を行う場合、VBAや手動操作が必要です。
この記事では、LET + LAMBDA +(再帰 / REDUCE)を組み合わせて、セル関数だけでループ処理を実現する方法を紹介します。
セル関数でループ処理を実装する例としてゴールシーク(二分探索法)をセル関数だけで実現する方法を取り上げます。
セル関数でループを実現する方法
セル関数でループを実現する以下の2つの手法を紹介します。
| No | 手法 | 特徴 | 停止条件 |
|---|---|---|---|
| 1 | 再帰 | 条件を満たすまで繰り返す | 任意の条件で早期終了可能 |
| 2 | REDUCE | 固定回数のループを実行 | 回数指定(早期終了は原則不可) |
サンプル
セル関数だけでゴールシーク(二分探索法)を実現する
問題設定
- 関数
f(x)の値を目標値に近づけたい。 - 例:
f(x) = 10^x - 目標値:
40 - f(x) = 40 となる x を求めたい
1. 再帰を使ったループ
Excelでは LET + LAMBDAで再帰関数を作ることができます。
引数に該当する部分は、以下となります。
ここの部分を変えることで、汎用的に使用できます
- 関数:二分探索法で解を求めたい式をLAMBDAで設定
- 目標値:目標値
- 下限:下限値
- 上限:上限値
=LET(
関数, LAMBDA(x, 10^x),
目標値, 40,
下限, 0,
上限, 10,
再帰関数, LAMBDA(再帰関数,左,右,前回値,
LET(
中央, (左 + 右)/2,
評価値, 関数(中央),
IF(中央 = 前回値, 中央,
IF(評価値 < 目標値,
再帰関数(再帰関数, 中央, 右, 中央),
再帰関数(再帰関数, 左, 中央, 中央)
)
)
)
),
再帰関数(再帰関数, 下限, 上限, "")
)
- 停止条件は「前回値と同じになったら(値が収束したら)終了」 ※IF(中央 = 前回値 , 中央)の部分
注意
再帰関数には再帰関数自身を引数に与える必要があります
LAMBDA(再帰関数,左,右,前回値,
あるいは
LAMBDA(関数自身,左,右,前回値,として再帰関数内では関数自身(関数自身, 左, 中央, 中央)として呼び出す
当初は以下のコード(AIに教えられたコード)でエラーになって、ハマってしまいました
=LET(
関数, LAMBDA(x, 10^x),
目標値, 40,
下限, 0,
上限, 10,
再帰関数,
LAMBDA(左,右,前回値,
LET(
中央, (左 + 右)/2,
評価値, 関数(中央),
IF(中央 = 前回値, 中央,
IF(評価値 < 目標値,
再帰関数(中央, 右, 中央),
再帰関数(左, 中央, 中央)
)
)
)
),
再帰関数(下限, 上限, "")
)
2. REDUCEを使った固定回数ループ
REDUCEを使うと、固定回数のループ処理が簡単に書けます。
引数に該当する部分は、関数~上限「1.再帰を使ったループ」と同じ + 回数(繰り返しの回数)です
=LET(
関数, LAMBDA(x, 10^x),
目標値, 40,
下限, 0,
上限, 10,
回数, 30,
結果, REDUCE(
HSTACK(下限, 上限),
SEQUENCE(回数),
LAMBDA(前回区間, ダミー,
LET(
左, INDEX(前回区間, 1),
右, INDEX(前回区間, 2),
中央, (左 + 右) / 2,
IF(関数(中央) < 目標値, HSTACK(中央, 右), HSTACK(左, 中央))
)
)
),
(INDEX(結果,1) + INDEX(結果,2)) / 2
)
- LOOPはREDUCE関数の部分
- 回数を指定して処理を繰り返す
- 早期終了は原則できない
ラムダ関数を引数として使うメリット
- 関数を変数としてLET内で定義できる
- 単純増加関数や複雑な計算式も外から渡せる
- 再利用性と可読性が上がる
まとめ
- セル関数でループ処理を実装する方法には「再帰」と「REDUCE」の2つがある
- 再帰では「自分自身を引数に渡す」実装が重要
- Excelのセル関数だけでも、ループ処理やゴールシークを実装できる