0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セル関数でループ処理を実装する方法:試しにセル関数だけで汎用的なゴールシーク(二分探索法)を実現してみた

Last updated at Posted at 2025-12-16

はじめに

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のセル関数だけでも、ループ処理やゴールシークを実装できる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?