パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

組み合わせをすべて表示する-再帰呼出し-

2010-11-02 09:01:36 | ExcelVBA
今日は、組み合わせを取り上げます。

1から5までの数字を使って5ケタの数字を作ります。
例えば、12345 という感じですね。

さあ、全部でどのくらいの数字を作れるのでしょうか?

11111
11112
11113
11114
11115
11121
11122
11123
11124
11125
11131

という具合に、順番にきちんと考えていくと分かりますね。
分かりやすくするために、左から1ケタ2ケタと呼びます。
1ケタ目は全部で5通りあります。
2ケタ目も5通りあります。
3ケタ目も5通りありますね。

そうです。
5*5*5*5*5=3125 通りあるのです。

さあ、エクセルでこの組み合わせを全部表示してみましょう。


プログラムでは、こういう場合、配列を使います。

5ケタなので、要素数が5の配列を用意します。
左の要素から順番に0,1,2,3,4というインデックス(添え字)がつきます。

この各要素に1から5までの数字が入るのです。


繰り返し処理ということは分かりますね。
でも、5ケタあるので、繰り返しを5回入れ子にしなければなりません。
これは、大変なことです。
まあ、5回なら何とかなりますが、もし、これが10ケタだったら、えらいことです。
桁数が増えるごとに、コードも変更しなければなりません。
もっと、楽にコーディングできないものでしょうか。

実は、楽にコードを書く方法があるのです。
「再帰呼出し」という手法を使うのです。
最初は、とっつきにくいのですが、コードのシンプルさにきっと感動するでしょう。


VBエディターを起動したら、次のように記述します。

'配列の宣言
Private Combi(5) As Integer

Private Sub Permutation(n As Integer)
  '引数は桁
  Dim i As Integer

  For i = 0 To 4
    Combi(n) = i + 1
    If n = 5 Then
      '5けたになると書き出し
      OutPut
    Else
      'ここで再帰呼出し
      Permutation (n + 1)
    End If
  Next
End Sub




このPermutationというプロシージャが今回のキモです。
引数に桁数を指定します。
5ケタになるまで、自分自身の関数を呼び出します。
こんな書き方が許されるんですね。

なお、コードの中の OutPut というのは、サブルーチンです。
つぎのように書いてください。

Private Sub OutPut()
  '書き出しのサブルーチン
  Dim i As Integer
  Dim c As String
  c = 0
  For i = 1 To 5
    c = c & Combi(i)
  Next
  Dim TenkiRow As Long
  TenkiRow = Range("A65536").End(xlUp).Offset(1).Row
  Cells(TenkiRow, 1).Value = c

End Sub




これは、難しくありません。
ただ、セルに配列の値を書き出しているだけですね。

さあ、以上のサブルーチンを使うメインのプロシージャを記述します。


Sub main()
    'サブルーチンを呼ぶ
    Permutation (1)
End Sub




なんと、1行だけのコードでした。

さあ、マクロを実行します。

しっかりと書き出されましたね。





だい
『ソフトウェア』 ジャンルのランキング
コメント (4)   この記事についてブログを書く
« 過去のお勧め記事 | トップ | ビューを切り替えるショート... »
最近の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
Unknown (りんご)
2010-11-02 18:34:02
へぇ~これはすごい。
何かに使えそう~
初めまして。 (るか)
2010-11-03 12:36:52
こんにちは。ブログをちょくちょく覗かせてもらってます。いつも裏技を知りに来る感じでとても楽しみにしています。

今回は、どうしても手に負えない質問があったため、スタッフさんに助けてもらいたいのですが、いかがでしょうか?

問題としては「Windows7におけるようこそ画面nの「ようこそ」の文字列の変更」です。

XPやVISTAのこの様な問題に対する答えの記事にあるような、winlogon.exe.muiを編集権限ゲットして、ResHacker.exeで変更したりしたものの、いかんせんうまく働いてくれないのです。どうかブログの記事にorメールでお助けをお願いできないでしょうか?

アドレスはhoonda31@yahoo.co.jpです。
迷惑だとは思いますが、御時間がありましたら、どうぞよろしくお願いします。
りんごさんへ (dai)
2010-11-04 08:45:08
コメントありがとうございます。

僕は、同じようなタイプの繰り返しには、再起呼び出しが使えないか、考えてみるようにしています。

今後もよろしくお願いしますね。
るかさんへ (ケン)
2010-11-04 09:52:55
はじめまして。

後ほどメールいたしますので、もう少し詳しく状況を教えてください。

コメントを投稿

ExcelVBA」カテゴリの最新記事

関連するみんなの記事