今日は、組み合わせを取り上げます。
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
これは、難しくありません。
ただ、セルに配列の値を書き出しているだけですね。
さあ、以上のサブルーチンを使うメインのプロシージャを記述します。
なんと、1行だけのコードでした。
さあ、マクロを実行します。
しっかりと書き出されましたね。
だい
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行だけのコードでした。
さあ、マクロを実行します。
しっかりと書き出されましたね。
だい
何かに使えそう~
今回は、どうしても手に負えない質問があったため、スタッフさんに助けてもらいたいのですが、いかがでしょうか?
問題としては「Windows7におけるようこそ画面nの「ようこそ」の文字列の変更」です。
XPやVISTAのこの様な問題に対する答えの記事にあるような、winlogon.exe.muiを編集権限ゲットして、ResHacker.exeで変更したりしたものの、いかんせんうまく働いてくれないのです。どうかブログの記事にorメールでお助けをお願いできないでしょうか?
アドレスはhoonda31@yahoo.co.jpです。
迷惑だとは思いますが、御時間がありましたら、どうぞよろしくお願いします。
僕は、同じようなタイプの繰り返しには、再起呼び出しが使えないか、考えてみるようにしています。
今後もよろしくお願いしますね。
後ほどメールいたしますので、もう少し詳しく状況を教えてください。