条件分岐の繰り返し
Select Case ステートメントをFor~Nextステートメントで挟む
For~Nextステートメント とSelect Case ステートメント
最初の行と最後の行を自動的に取得する
長い表の場合、最終行を自分で確認してコードに入力したりするのは、面倒です。あるいは、長さが毎回変わる場合にも、ストレスになりますね。そこで評価する最初の行と最後の行を自動的に取得するコードに変更しましょう。
(サンプルファイルは、こちらから 2013マクロ講座26回サンプルデータ)
優良可不可の判定を繰り返す For文
今回は、下図のように、長めの成績表を判定します。
評価する最初のセルはC4セルです。
評価する最初のセルはC4セルです。
For~Nextステートメントの使い方
前頁のコードを長くなった表用に変更しました。
考え方は同じです。繰り返し回数は、カウンタの変化範囲(開始値と終了値)で指定しますが、開始値は0である必必ずしも0や1である必要はありません。
そこで開始行と終了行を変数iの中身として利用しています。 For i = 4 To 38
考え方は同じです。繰り返し回数は、カウンタの変化範囲(開始値と終了値)で指定しますが、開始値は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)
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
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で繰り返し処理をする場合に、セルをアクティブにしなくても処理できますが、変数が増えるのでここではあえて使っていません。
また、For Nextで繰り返し処理をする場合に、セルをアクティブにしなくても処理できますが、変数が増えるのでここではあえて使っていません。