第10講 プロシージャの再帰的使用
第1話 プロシージャの再帰的使用とは?

プロシージャは、他のプロシージャに仕事を依頼できました。
実は、仕事の依頼は自分にもできるのです。
『自分が自分に仕事をお願いする???』
ですよね。
では、どういうことが早速体験して頂きましょう。
参考ファイルを開くか、
ご自分で次のようにプログラミングをして、
実行ボタンを押してみてください。
Private Sub CommandButton1_Click()
  f (0)
End Sub
Sub f(n As Byte)
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  If n < 10 Then f (n + 1)
End Sub
Private Sub CommandButton2_Click()
  Rows("5:200").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

すると、エクセルシートの実行画面は、
数独
となります。
  If n < 10 Then
f (n + 1)
f (n + 1)の部分が、自分に仕事を依頼している部分です。

ちょっとわかりにくいかも知れませんので、
プログラムを次のように変更してみてください。
Dim n As Byte
Private Sub CommandButton1_Click()
  n = 0
  f
End Sub
Sub f()
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  n = n + 1
  If n < 10 Then f
End Sub
Private Sub CommandButton2_Click()
  Rows("5:200").Select
  Selection.ClearContents
  Range("A1").Select
End Sub
参考ファイル

実行画面はまったく同じで
魔方陣
です。
1行目
Dim n As Byte
に注目してください。

前に、プロシージャは独立であるといい、
独立とは同名であっても変数は、
そのプロシージャ内でしか有効でないと説明しました。
このようにプロシージャ内でしか有効でない変数を
ローカル変数といいます。
プロシージャ内で宣言した変数は、
すべてローカル変数となります。
ですが、
ときにはプログラム全体で有効な変数も
欲しい場面もある訳です。
このようにプロシージャを越えてプログラム全体で、
有効な変数をグローバル変数といいます。
このグローバル変数を用意するには、
Dim n As Byte
Private Sub CommandButton1_Click()

          ・・・
          ・・・
          ・・・
のようにプログラム冒頭で宣言すれば良いのです。

さて、
Sub f()
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  n = n + 1
  If n < 10 Then
f
End Sub
fに注目してください。
Subプロシージャfの中で、
fすなわち自分に仕事を依頼しています。
ただし、If n < 10 Thenの条件が付いていますが。
Subプロシージャの仕事内容は、
① エクセルシートに『はじめてのプロシージャの再帰的使用。』を表示させる。
② 回数を数える。
③ 自分に仕事を依頼する。
の3つからなります。
③については、回数が10回以内ならという条件が付いています。


ですが、自分が自分に仕事を依頼するってどういうことでしょうか。
何故、たった1人なのに10人分の仕事ができてしまうのでしょうか。
この問いに答えるには、
最初のコード
Private Sub CommandButton1_Click()
  f (0)
End Sub
Sub f(n As Byte)
  Cells(5 + n, 2) = "はじめてのプロシージャの再帰的使用。"
  If n < 10 Then f (n + 1)
End Sub
の方がわかりやすいことになります。



第9講第11話へ 第2話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ