01-VBA

制御構文|Excel VBA (Part.5)【For Next】基本編

お知らせ

こちらの記事は、電子書籍「難しく考えない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記事が電子書籍にて販売となりました。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST