お知らせ
こちらの記事は、電子書籍「難しく考えないExcel VBA基礎学習編」として出版されました。記事は途中までが試し読みの対象となります。
howahowablogのVBA記事が電子書籍にて販売となりました。
目標
For~Nextの文法を理解する
繰り返しの動きをイメージできる
For~Nextステートメントの概要と利用方法
For~Nextステートメントとは
VBAで利用される繰り返しの制御構文です。
VBAの繰り返しにはFor~NextステートメントとLoop~Doステートメントがあります。
連続したセルへの処理等に利用されることが多いです。
繰り返しの制御構造を用いない場合のプログラム
A1セルからE1セルに連続で値を入力したい場合を考えてます。この時、繰り返しの文を利用しなければ次のように記述することになります。
Sub repetition()
Cells(1, 1) = InputBox("好きな果物を5つ答えてください。")
Cells(1, 2) = InputBox("好きな果物を5つ答えてください。")
Cells(1, 3) = InputBox("好きな果物を5つ答えてください。")
Cells(1, 4) = InputBox("好きな果物を5つ答えてください。")
Cells(1, 5) = InputBox("好きな果物を5つ答えてください。")
End Sub
次に繰り返しの文を利用した記述を確認していきます。
For~Nextの基本形の構文とサンプルプロシージャ
基本形の構文
まずは基本の形を確認します。構文は以下のとおりです。
構文 | Dim i As Integer For i = 1 To 5 繰り返しをさせたい処理 Next i |
サンプルプロシージャ1
'repetitionFor_Nextという関数名に意味はなく自由な名前を付けることが出来ます。
Sub repetitionFor_Next()
Worksheets("Sheet1").Select
Dim i As Integer
For i = 1 To 5
Cells(1, i) = InputBox("好きな果物を5つ答えてください。")
Next i
End Sub
実行結果
For~NextにStepを利用した形の構文とサンプルプロシージャ
For~Nextではカウントに対してStepを付けてカウントを一定の間隔で飛ばすことができます。
例えばFor i = 1 To 10 Step 2とすればカウントは1,3,5,7,9となります。最初の値は1で、続いて2を足し続けた数がカウントの数となります。For i = 10 To 1 Step -2のようにマイナスを付けて数を減らしながら値をスキップすることもできます。
For~NextにStepを利用した形の構文
構文は以下のとおりです。
構文 | Dim i As Integer For i = 1 To 10 Step 3 繰り返しをさせたい処理処理 Next i |
サンプルプロシージャ2
Sub repetitionFor_Next_Step()
Dim i As Integer
Dim Months As Integer
Dim Sat As Integer
Months = InputBox("月数を入力して下さい")
Select Case Months
Case 1, 3, 5, 7, 8, 10, 11, 12
For i = 1 To 31
Cells(i, 1) = i & "日"
Next i
Case 4, 6, 9
For i = 1 To 30
Cells(i, 1) = i & "日"
Next i
Case 2
For i = 1 To 28
Cells(i, 1) = i & "日"
Next i
End Select
Sat = InputBox("最初の土曜日の日付を入力してください")
For i = Sat To 31 Step 7
Cells(i, 1).Font.Color = RGB(0, 0, 255)
Cells(i + 1, 1).Font.Color = RGB(255, 0, 0)
Next i
End Sub
実行結果
For~NextにExit Forを利用した形の構文とサンプルプロシージャ
Exit Forを利用すると繰り返しの途中でプログラムを中断させることができます。
For~NextにExit Forを利用した形の構文
構文は以下のとおりです。
構文 | Dim i As Integer For i = 1 To 5 If 条件 Then Exit For 繰り返しをさせたい処理 Next i |
サンプルプロシージャ3
サンプルプロシージャ2と同じことを行っています。今回は月数ごとにFor文の最終値を変更するのではなく、最終値はあくまでも31として月ごとにプログラムを最後まで行うか途中で止めるかで分けています。
4月、6月、9月はFor文の「i」の値がが「30」を超えたらExit Forでプログラムを抜けています。2月は「28」を超えたらExit Forでプログラムを抜けています。(閏年は今回は未設定)
Sub repetitionFor_Next_Exit_For()
Dim i As Integer
Dim Months As Integer
Dim Sat As Integer
Months = InputBox("月数を入力して下さい")
For i = 1 To 31
Cells(i, 1) = ""
Next i
If Months > 0 And Months < 13 Then
For i = 1 To 31
Cells(i, 1) = i & "日"
Cells(i, 1).Font.Color = RGB(0, 0, 0)
If Months = 4 Or Months = 6 Or Months = 9 Then
If i = 30 Then
Exit For
End If
ElseIf Months = 2 And i = 28 Then
Exit For
End If
Next i
Sat = InputBox("最初の土曜日の日付を入力してください")
For i = Sat To 31 Step 7
Cells(i, 1).Font.Color = RGB(0, 0, 255)
Cells(i + 1, 1).Font.Color = RGB(255, 0, 0)
Next i
End If
End Sub
実行結果
For~Nextステートメントの高速化?
Application.ScreenUpdatingを利用する
For~Nextステートメントを利用する時の注意点
VBAはエクセルに自動処理を行わせるプログラミング言語であるため、プログラム内にワークシートやセルを多く利用します。これは、For~Nextステートメントなどの繰り返し文にも当てはまります。
但し、For~Nextステートメント内でワークシートやセルを利用する場合、「プログラムの処理」⇔「エクセルのワークシートやセルの状態の更新とその表示」の行き来が頻繁に行われることになり遅延の原因になることがあります。
例えば、10000回の繰り返しがあった場合、「ブロック内の1処理」と「エクセルのワークシートやセルの状態の更新後の表示」が10000回、交互に行われることになります。
特に、エクセルの画面の更新と表示では、画面が更新されるごとに、そのシートの内容を切り替える処理が発生するため、処理が重くなり、遅延の大きな原因となってしまいます。
VBAでは、この画面の更新についてApplication.ScreenUpdatingプロパティをFalse設定することで無効化できます。
実際に画面上の更新が行われるプログラムを作成して動かしてみます。
Application.ScreenUpdatingを使用しないサンプルプログラム
次のCells(i, 1).Selectは、セルの選択を毎回行うのでApplication.ScreenUpdatingプロパティをFalse設定しない場合は、セルを選択した後の更新内容を表示する処理が働くことになります。
Sub UnusingScreenUpdating()
Dim i As Long
For i = 1 To 1000
Cells(i, 1).Select
Cells(i, 1).Value = i
Next i
End Sub
実行結果
Application.ScreenUpdatingを使用したサンプルプログラム
Application.ScreenUpdatingプロパティをFalse設定した場合はセルを選択した後の更新内容を表示する処理が無効化されれ、プログラムとしての処理のみを行わせることができます。
Sub usingScreenUpdating()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To 1000
Cells(i, 1).Select
Cells(i, 1).Value = i
Next i
Application.ScreenUpdating = True
End Sub
実行結果
Application.ScreenUpdatingプロパティのFalse設定はFor~Nextステートメントの高速化としてよく利用されますが、For~Nextステートメント内であってもシートの更新にかかわるプログラムがない場合は必要ありません。この「高速化」はFor~Nextステートメント自体を早くするのではなくて処理として不必要な動き(更新内容の表示)をなくすことで実現しています。
この記事の試し読みはここまでとなります。
…
今回は以上となります。
howahowablogのVBA記事が電子書籍にて販売となりました。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。