VBA技術解説
再帰呼出しについて(再帰プロシージャー)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013-06-04 最終更新日:2022-10-14

再帰呼出しについて(再帰プロシージャー)


再帰プロシージャとは、自分自身を呼び出すプロシージャです。
プロシージャが、そのプロシージャ内で自分自身を呼び出すような処理を再帰呼び出しと呼びます。
自分自身を呼び出し、終了条件を満たすまで、意図的に無限ループさせます。
再帰呼出を実装したプロシージャーは再帰プロシージャーと呼びます。


指定数値の階乗を求める再帰VBA

Sub sample()
  MsgBox sample_sub(5)
End Sub

Function sample_sub(ByVal n As Long) As Long
  If n <= 1 Then
    sample_sub = 1 'ここで再帰処理は終了します。
  Else
    sample_sub = n * sample_sub(n - 1) 'ここで自分自身を呼び出しています。
  End If
End Function

上の例では、5の階乗、つまり、120がメッセージボックスに表示されます。
ステップ実行(F8)で、1行ずつ確認しながら、nの変化を確認して下さい。

sample_sub = n * sample_sub(n - 1)
これが実行されると、再び、
Function sample_sub(ByVal n As Integer)
ここに入ってくることが確認できます。

そして、
sample_sub = 1
この後は、
End Function
が繰り返されることが分かる筈です。
下の図と合わせて、ぜひ、ステップ実行(F8)で確認してみてください。

Excel VBA 再帰


再帰プロシージャで考慮すべき事項

制限条件の確認

再帰プロシージャでは、再帰を終了する条件を最低 1 つテストする必要があります。
また、妥当な回数の再帰呼び出しを行ってもこの条件が満たされない場合の処理も必要です。
必ず満たされる条件を最低 1 つ用意しないと、プロシージャが無限ループに陥る可能性が高くなります。
再帰プロシージャを作成した場合、最低 1 つの制限条件を満たしていることを必ずテストする必要があります。
また、再帰呼び出しが多すぎるためにメモリを使い果たすことがないことを確認する必要があります。

メモリ使用状況

アプリケーションがローカル変数に使用できる領域は限られています。
プロシージャが自分自身を呼び出す際、ローカル変数のコピーが毎回作成され、領域を消費します。
このプロセスがいつまでも続くと、最終的には StackOverflowException エラーが発生します。

かっこ()を使った呼び出しをする

Functionプロシージャーを再帰的に呼び出すときには、引数リストがない場合でも、プロシージャ名の後にかっこを付ける必要があります。
そうしないと、関数名が関数の戻り値を表していると見なされてしまいます。

Subプロシージャーで再帰呼び出しする場合

Subプロシージャーで再帰呼び出しする場合は、ByRef(参照渡し)で引数を渡していきます。
フィボナッチ数列(再帰呼び出し)
・フィボナッチ数列を出力する再帰VBA ・再帰呼び出しを使わない場合のVBA ・再帰プロシージャで考慮すべき事項 ・再帰呼び出しの実践例

実際の再帰処理では、Functionの戻り値とByRef引数を組み合わせて使用することも多々あります。


再帰呼び出しの実践例

練習問題を用意してあります。
練習問題24(再帰呼出し)
・マクロVBA練習問題 ・シンキングタイム ・マクロVBA練習問題回答へ

ここでは、再帰呼出しを使い、FileSystemObjectで全サブフォルダのファイル一覧を取得しています。
サブフォルダの階層は際限がない為、一般的なループでは処理が難しいのですが、
再帰呼出しを使う事で、短いVBAコードで実現する事が出来ます。
再帰呼出しとFileSystemObjectが出てくるのは、№6からですが、Dir関数と合わせて、一度は目を通しておくと良いでしょう。

各種ゲーム

以下のようなゲーム作成においては、再帰呼び出しは必須になります。

数独(ナンプレ)を解くVBAに挑戦
数独は、一般に「ナンバープレース(ナンプレ)」と呼ばれ、外国では「sudoku」と呼ばれているようです、この数独をExcelマクロVBAで解いてみようと言う事です。解き方は、とにかく片っ端から数字を当てはめていくという、なんとも芸の無い方法です。
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証
数独(ナンプレ)を解くアルゴリズムを例に、アルゴリズムの要点と、それによるパフォーマンスを検証します、数独(ナンプレ)を解くVBAに挑戦 ここでは、とにかく全ての数字を当てはめていくという、いわば全数チェックでの解法を使いました。考察するまでもなく、かなりの無駄がある事は明白です。

ナンバーリンク(パズル)を解くVBAに挑戦
ナンバーリンクというパズルがあります、これをエクセルVBAで解いてみようと思います、数独(ナンプレ)に続くパズルVBA解法の第二弾です。ナンバーリンクをご存じない方は、、ウィキペディア ナンバーリンクのおためし問題 このあたりをお読みください。
ナンバーリンクを解くVBAのパフォーマンス改善
「ナンバーリンク(パズル)を解くVBAに挑戦」で作成したVBAでナンバーリンクを解く事には成功しました、しかし、10×10なら数分で解けるものの、10×18でやったところ、4時間半もかかってしまいました。12×12では、待ちきれずに途中で止めてしまいました。

オセロを作りながらマクロVBAを学ぼう
ExcelマクロVBAでオセロ(リバーシ)を作っていきながら、マクロVBAを学んで行きましょう。目的は、マクロVBAの学習であり、思考を整理しVBAでプログラミングする学習です。従って、強いソフトを作ることが目的ではありませんので、最近流行のAIなんちゃら…なんていうのは考えるつもりはありません。



同じテーマ「マクロVBA技術解説」の記事

マクロ作成後に表位置がずれた場合の対処
ExecuteExcel4Macroについて
「Excel 4.0 マクロ」の使い方
再帰呼出しについて(再帰プロシージャー)
フィボナッチ数列(再帰呼び出し)
文字列でのセル参照と文字列の計算式について(Evaluate,INDIRECT)
リボンを非表示、2003以前ならメニューを非表示
印刷ページ設定の余白をセンチで指定する(CentimetersToPoints)
文字列としてのプロシージャー名を起動する方法(Run,OnTime)
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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