[VBA] 繰り返し処理にネストされた条件分枝

「この講座を通して、少しでも VBA仲間が増えるといいなあ」
と願いつつ毎日頑張って記事を書いてます。今回は約数を求めるプログラムです。

繰り返し処理にネストされた条件分枝

 16 の約数を求めるマクロです。
 16 を 1 から順に割っていって、割り切れたら約数と判定します。

Sub Divisor_6()

  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;

にセミコロン「;」が付いていますけど、これは通常はイミディエイトウィンドウに縦に並ぶ表示を横書きにして見やすくするという、ちょっとしたテクニックです。
 

条件分枝の入れ子 (ネスト)

 先ほどののマクロを少し書き換えて、入力した数値の約数を求められるようにしてみます。

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

 マクロを実行すると数値の入力を促されます。たとえば「 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

という処理を行うということです。プログラミングでは、どの変数がどのように動くのかということを丁寧に把握しておく必要があります。次回は「ユーザーさんが意味不明な値を入力」した場合にも対応できるように、適切なエラー処理のできるプログラムに変えてみます。

エクセルや数学に関するコメントをお寄せください