← コード一覧へ戻る
実務プロシージャ

終了条件付きで自分自身を呼び出す

再帰するFunctionで5の階乗を求めます。終了条件と入力範囲を設けて無限呼び出しやLongの範囲超過を防ぎます。

実行前に確認

  • 0または1で呼び出しを終える条件が必要です。終了条件がなければ呼び出しを繰り返してメモリ不足になります。
  • Longで扱える階乗はこの例では0~12に制限します。13以上はオーバーフローするため、例ではエラーとして拒否します。
  • Excel実機での動作は未確認です。コピーした練習用ブックで試してください。

1サンプルコード

Option Explicit

Sub Example7057()
    Dim n As Long

    n = 5
    MsgBox n & " の階乗: " & Factorial7057(n)
End Sub

Private Function Factorial7057(ByVal n As Long) As Long
    If n < 0 Or n > 12 Then
        Err.Raise vbObjectError + 7057, "Factorial7057", "nは0~12にしてください。"
    End If
    If n <= 1 Then
        Factorial7057 = 1
    Else
        Factorial7057 = n * Factorial7057(n - 1)
    End If
End Function

図で見る5の階乗を再帰で計算する

イメージ図

同じ関数へ小さくした数値を渡し、終了条件から結果を返します。

  1. n = 5で呼び出す

    Example7057からFactorial7057(5)を呼び出す

  2. 1まで小さくして計算

    5 → 4 → 3 → 2 → 1。1で再帰を止め、戻りながら順に掛ける

  3. 120を表示

    Factorial7057が120を返し「5 の階乗: 120」を表示

同じ標準モジュールに補助Functionも貼り付けます。入力は0~12に制限し、13以上などはエラーにします。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelの練習用ブックを.xlsm形式で保存します。Alt+F11でVBEを開き、[挿入]→[標準モジュール]で作った空のモジュールに、Option Explicitから末尾まで、この例だけを貼り付けます。

  2. 2

    下のFactorial7057関数も含めて、同じ標準モジュールに貼り付けます。実行するのはExample7057です。

  3. 3

    Example7057のSub内にカーソルを置き、F5キーで実行します。

  4. 4

    5×4×3×2×1を計算した「5 の階乗: 120」が表示されます。

使っている機能の公式ドキュメント(Microsoft Learn)