条件分岐の繰り返し

Select Case ステートメントをFor~Nextステートメントで挟む

For~Nextステートメント とSelect Case ステートメント

最初の行と最後の行を自動的に取得する

長い表の場合、最終行を自分で確認してコードに入力したりするのは、面倒です。あるいは、長さが毎回変わる場合にも、ストレスになりますね。そこで評価する最初の行と最後の行を自動的に取得するコードに変更しましょう。
(サンプルファイルは、こちらから 2013マクロ講座26回サンプルデータ

優良可不可の判定を繰り返す For文

今回は、下図のように、長めの成績表を判定します。
評価する最初のセルはC4セルです。

For~Nextステートメントの使い方

前頁のコードを長くなった表用に変更しました。
考え方は同じです。繰り返し回数は、カウンタの変化範囲(開始値と終了値)で指定しますが、開始値は0である必必ずしも0や1である必要はありません。
そこで開始行と終了行を変数iの中身として利用しています。 For i = 4 To 38
カウンタ変数を For i = 4 To 38とするなら、 開始行と終了行をRange(”C4”) で取得できるのではないかと考えることができますね。
開始値は、 処理の最初の行です。 終了値は、 処理の最後の行です。 For i = 最初の行 To 最後の行 は以下のコードで取得できます。RangeではなくCellsを使用した方が 行や列を扱うときは理解しやすいです。
最初の行 = Cells(4, 3).Row
最後の行 = Cells(4, 3).End(xlDown).Row
そして、最初の行と最後の行を変数に割り当てます。
Range(”C4")は、Cells(4,3)と同じですが、これも変数に割り当ててやります。
Dim tokuten As Range, i As Long, sgyou As Long, lgyou As Long Set tokuten = Cells(4, 3)
すると、最初の行 、最後の行 は以下のコードで取得できます。
    sgyou = tokuten.Row
    lgyou = tokuten.End(xlDown).Row
    tokuten.Activate
この2つを For i = 4 To 38に入れ替えることができます。
For i =sgyou To lgyou
Sub hyouka3()
Dim tokuten As Range, i As Long, sgyou As Long, lgyou As Long
Set tokuten = Cells(4, 3)
    sgyou = tokuten.Row
    lgyou = tokuten.End(xlDown).Row
    tokuten.Activate
For i = sgyou To lgyou
    Select Case ActiveCell.Value
        Case Is >= 80
            ActiveCell.Offset(0, 1).Value = "優"
        Case Is >= 70
            ActiveCell.Offset(0, 1).Value = "良"
         Case Is >= 60
            ActiveCell.Offset(0, 1).Value = "可"
       Case Else
             ActiveCell.Offset(0, 1).Value = "不可"
    End Select
    ActiveCell.Offset(1, 0).Activate
Next
End Sub
今回のコードで必要なのは、評価の対象となる最初の行 Cells(4, 3)を指定してやるだけです。 コードを実行すると、長い表でも、手間なく多数の条件分岐で評価することができます。
マクロを実行すると、行数が毎回変わるような表であっても最初の開始行が変わらない限り同じコードで利用できます。
また、For Nextで繰り返し処理をする場合に、セルをアクティブにしなくても処理できますが、変数が増えるのでここではあえて使っていません。