For文の特性を知ろう。

繰り返し処理でよく使われるのが、For 〜 Next文です。
ある回数、繰り返して実行させる、とても便利なステートメントです。
このステートメントの特性を知っておくと、マクロを組む上でとても重宝します。

1.最後まで処理したときの、変数の最終値を知っておく。

下のプロシージャは、5行5列の範囲から、ある数値がどこにあるのか探すものです。
例では、4という数字が、5行目の3列目にあると示しています。
では、ここにない数値を探させたら、どうなるのでしょうか?

Sub test()

  Dim R As Integer '行
  Dim C As Integer '列
  Dim n As Integer '番号

  n = 4
  For R = 1 To 5
    For C = 1 To 5
      If Cells(R, C) = n Then Exit For ←@
    Next C
    If Cells(R, C) = n Then Exit For ←A
  Next R

  MsgBox "番号=" & n & " 行=" & R & " 列=" & C ←B

End Sub
 
@ セルの値がnと同じだったら、For文(変数Cの)を抜け出ます。

A セルの値がnと同じだったら、For文(変数Rの)を抜け出ます。

B ここで、それぞれの変数の内容を表示させます。


この表にない数値を探させたら・・・、
例えば、n=30 として、実行させると、Rは6を、Cも6を返します。
つまり、For文では、最後まで処理したとき、変数はゴールとして設定した値の
次の値になって終わるということです。

これを利用すると、次のようなことができます。
Sub test()

  Dim R As Integer '行
  Dim C As Integer '列
  Dim n As Integer '番号

  n = 30
  For R = 1 To 5
    For C = 1 To 5
      If Cells(R, C) = n Then Exit For
    Next C
    If Cells(R, C) = n Then Exit For
  Next R

  If R = 6 Then ←C
    MsgBox "指定した番号(" & n & ")は、ありませんでした。"
  Else ←D
    MsgBox "番号=" & n & " 行=" & R & " 列=" & C
  End If

End Sub
C Rの値が6のときは、数字が見つからなかったということなので、
   「見つからなかった」というメッセージを表示します。

D 反対に、それ以外の数字の時は、行や列の位置を表示します。

2.繰り返し処理のできないスタートとゴールの値のときの、処理の仕方を知っておく。

これは、例えば、R=1 to 0 のような設定をした場合です。
結論から言えば、何も実行せずに終わります。
そうすると、あり得ない値を渡したときには、処理を飛ばしてくれることがわかります。

Sub test()

  Dim R As Integer
  Dim n As Integer

  For R = 1 To 0
    n = n + 1
  Next R

  MsgBox "R=" & R & " n=" & n

End Sub
 


返されたRの値は1で、内容のnはまったく実行されていません。
 

3.スタートとゴールの設定と刻みが合致しない場合の、処理の仕方を知っておく。

これは、例えば、R=1 to 10 Step 4 などの設定をした場合です。
結論から言うと、Rは1、5、9のとき実行し(3回)、13になったとき処理を飛ばします。

Sub test()

  Dim R As Integer
  Dim n As Integer

  For R = 1 To 10 Step 4
    n = n + 1
  Next R

  MsgBox "R=" & R & " n=" & n

End Sub
 
 

足し算は、3回行われています。