「この講座を通して、少しでも VBA プログラマーが増えるといいなあ」と願いつつ、毎日頑張って記事を書いてます。今回は約数を求めるプログラムです。
【VBA】繰り返し処理に条件分枝を組み込みます
以下は 16 の約数を求めるマクロです。
16 を 1 から順に割っていって、割り切れたら約数と判定します。
'[VBA] 16の約数を返すSubプロシージャ Sub Divisor_16() Dim i As Integer For i = 1 To 16 If 16 Mod i = 0 Then Debug.Print i; End If Next i End Sub
マクロを実行すると、イミディエイトウィンドウに 16 の約数「1, 2, 4, 8, 16」が表示されます。
Divisor_6() の中身を見てみましょう。For…Nextステートメントの中に IF…Thenステートメントが入れ子になっています。カウンタ変数 i を1つずつ順に加えながら、
16 を 1 で割った余りが 0 ならば表示する
16 を 2 で割った余りが 0 ならば表示する
16 を 3 で割った余りが 0 ならば表示する
という処理を繰り返しています。また、5 行目のコード
Debug.Print i;
にセミコロン「;」が付いていますが、これは通常はイミディエイトウィンドウに縦に並ぶ表示を横書きにして見やすくするという、ちょっとしたテクニックです。
先ほどののマクロを少し書き換えて、入力した数値の約数を求められるようにしてみます。
'[VBA] ユーザーから値を受け取って約数を返すプロシージャ Sub Divisor() Dim i As Long, j As Double j = InputBox("整数を入力してください") If j <> Int(j) Then MsgBox "整数ではありません" Else For i = 1 To j If j Mod i = 0 Then Debug.Print i; End If Next i End If End Sub
Divisor() を実行すると数値の入力を促されます。たとえば「40」と入力すると、
1 2 4 5 8 10 20 40
というように 40 の約数が全て並びます。整数以外の値を入力すると「整数ではありません」というメッセージが表示されます。
変数 i は Long型(長整数型)という非常に大きな桁の整数を扱える型で宣言しています。Integer型の上限値が 32,768 であるのに対して、Long 型の上限値は 2,147,483,647 となっています。なのでたとえば「7862422」のような大きな値を入力しても
1, 2, 29, 58, 135559, 271118, 3931211, 7862422
というようにちゃんと約数を並べてくれます。
If…Then…Elseステートメントが2つありますね。最初の条件分枝で
If j <> Int(n) Then
は「入力された数値が整数でないならば」という文です。これが真である、つまり j が整数でない場合は「整数ではありません」というメッセージを表示して、 Else 以下の処理は全部とばして一番最後の End If まで行きます。つまりそれでプログラムは終わりということです。この条件文を満たさない場合、つまり j が整数である場合には Else 以下の処理で約数を求めます。
ユーザーさんにインプットボックスから値を入力してもらって j に格納していますが、これは
For i = 1 To j
というループ処理の上限値となっています。j に 40 が入力されたら
For i = 1 To 40
という処理を行い、j に 100 が入力されたら
For i = 1 To 100
という処理を行うということです。プログラミングでは、どの変数がどのように動くのかということを丁寧に把握しておく必要があります。次回は「ユーザーさんが意味不明な値を入力」した場合にも対応できるように、適切なエラー処理のできるプログラムに変えてみます。
エクセルや数学に関するコメントをお寄せください