01-VBA

制御構文|Excel VBA (Part.5)【For Next】基本編 | 現役エンジニア&プログラミングスクール講師

目標

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ステートメントを利用する時の注意点

For~Nextステートメント利用する場合、プログラム処理⇔画面の更新が送って遅延の原因になることがあります。この画面の更新についてApplication.ScreenUpdatingプロパティをFalse設定することで無効化できます。

実際に画面上の更新が行われるプログラムをFor~Nextステートメント内に組んで動かしてみます。

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ステートメント自体を早くするのではなくて処理として不必要な動きをなくすことで実現しています。

それぞれ実行を行ってみてください。実行の方法が分からない方はこちらを参考にしてください。

初めてのExcelVBA:プロシージャの記述と実行 | 現役エンジニア&プログラミングスクール講師ExcelVBAのモジュールとプロシージャについて確認してその生成方法などを説明...

今回は以上となります。

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

ブックマークのすすめ

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

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

Excel VBA の「デバッグ」(Part.1)「自動構文チェック機能」「VBAProjectのコンパイル」「プロシージャ実行時エラー」| 現役エンジニア&プログラミングスクール講師

2022年12月14日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ExcelVBAのActiveSheetプロパティ | 現役エンジニア&プログラミングスクール講師

2022年8月10日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

VBScriptを利用したファイルの複製(Part.3)| 現役エンジニア&プログラミングスクール講師

2023年2月13日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ダイアログボックス|Excel VBA (Part.3)【InputBox+AutoFilter】編 | 現役エンジニア&プログラミングスクール講師

2022年12月4日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の「デバッグ」(Part.2)「ステップモード」「ブレークポイント」| 現役エンジニア&プログラミングスクール講師

2022年12月14日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

制御構文|Excel VBA (Part.4)【Select Case】| 現役エンジニア&プログラミングスクール講師

2022年11月19日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site