ExcelマクロVBA技術解説 | 再帰呼出しについて(再帰プロシージャー) | ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2013-09-05

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


再帰プロシージャとは、自分自身を呼び出すプロシージャです。

プロシージャが、そのプロシージャ内で自分自身を呼び出すような処理を再帰呼び出しと呼びます。


自分自身を呼び出し、終了条件を満たすまで、意図的に無限ループさせます。

再帰呼出を実装したプロシージャーは再帰プロシージャーと呼びます。


指定数値の階乗を求める再帰プロシージャー

Sub sample()
  MsgBox sample_sub(5)
End Sub
Function sample_sub(ByVal n As Integer)
  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

が繰り返されることが分かる筈です。


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

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

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

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


エクセルでファイル一覧を作成

ここでは、再帰呼出しを使い、FileSystemObjectで全サブフォルダのファイル一覧を取得しています。

サブフォルダの階層は際限がない為、一般的なループでは処理が難しいのですが、

再帰呼出しを使う事で、短いVBAコードで実現する事が出来ます。

再帰呼出しとFileSystemObjectが出てくるのは、6からですが、Dir関数と合わせて、一度は目を通しておくと良いでしょう。




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

マクロ作成後に、表位置がずれた場合の対処
ExecuteExcel4Macroについて
文字列でのセル参照と文字列の計算式について(Evaluate,INDIRECT)
リボンを非表示、2003以前ならメニューを非表示
印刷ページ設定の余白をセンチで指定する(CentimetersToPoints)
文字列としてのプロシージャー名を起動する方法(Run,OnTime)
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実

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

VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)
エラーへの対処|MOS VBAエキスパート対策(3月10日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.定数と型宣言文字(Const)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.繰り返し処理(For Next)|ExcelマクロVBA入門



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

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


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





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

    本文下部へ

    ↑ PAGE TOP