01-VBA

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

目標

For Each文を理解して利用できる

For Eachステートメントの概要と利用方法

For Eachステートメントとは

For Each ステートメントは指定した配列やコレクションの各要素を順番に取り出して処理に利用することができます。

コレクションとは配列のように沢山の値を(順番をつけて)まとめたものです。※配列は厳密にはコレクションとは異なります。For Eachでは配列や複数のワークシート、複数のセルなど、指定したオブジェクトをひとつずつ取り出して処理に利用することができます。

For Eachステートメントの利用方法

Rangeを利用する場合

要素を取り込むための変数をRangeオブジェクトとして宣言

サンプルプロシージャ1

Sub DayPrint()

Dim DayNum As Range
Dim i As Integer
i = 1
For Each DayNum In Range("A1:A31")
    DayNum = i & "日"
    i = i + 1
Next DayNum

End Sub

実行結果

Worksheetを利用する場合

要素を取り込むための変数をWorksheetオブジェクトとして宣言
宣言での型指定では「Worksheet」と単数形でFor Each In Nextのなかでは「Worksheets」と複数形になります。

サンプルプロシージャ2

こちらのサンプルプロシージャは、制御構文|Excel VBA (Part.6)【For Next】ネスト編(前編)で利用したものをFor Eachで書き換えた内容となります。

Sub sample()

Dim i As Integer, j As Integer
Dim tableRow As Integer, tableColumns As Integer
Dim ws As Worksheet

Sheets("Sheet4").Select
Range("C3").Select
ActiveCell.CurrentRegion.Select
Selection.ClearContents

For Each ws In Worksheets

    If ws.Name = "Sheet4" Then
        Exit For
    End If
    
    ws.Select
    Range("C3").Select
    ActiveCell.CurrentRegion.Select
    tableRow = Selection.Rows.Count
    tableColumns = Selection.Columns.Count
   
    If ws.Name = "Sheet1" Then
        Selection.Copy
        Sheets("Sheet4").Select
        Range("C3").Select
        ActiveSheet.Paste
    Range("C3").Select
    ElseIf ws.Name <> "Sheet1" Then
        ActiveCell.Offset(1, 0).Resize(tableRow - 1, tableColumns).Select
        Selection.Copy
        Sheets("Sheet4").Select
        Range("C3").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
        ActiveSheet.Paste
    End If

    Application.CutCopyMode = False
    
    If ws.Name = "Sheet3" Then
        ActiveCell.CurrentRegion.Select
        tableRow = Selection.Rows.Count
        tableColumns = Selection.Columns.Count
        ActiveSheet.Range("H5").Select
        
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        For j = 1 To tableRow - 2
            ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-2]-RC[-1]"
            ActiveCell.Offset(1, 0).Select
        Next j
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End If
Next ws

End Sub

実行結果

配列を利用する場合

‘配列をArray関数を利用して初期化する時はVariant型で宣言して動的配列にする。

Dim arr() As Variant
arr = Array(0, 1, 2, 3, 4)

‘For Eachステートメント内の要素を取り出す方の変数はVariant型に設定する。
Dim item As Variant

For Each item In arr
Debug.Print (item)
Next

実行結果

‘要素ごとに代入をするときは配列の個数を指定してString型やInteger型など明示して指定する。(Variant型でも可)

Dim arr(4) As Integer
arr(0) = 0
arr(1) = 1
arr(2) = 2
arr(3) = 3
arr(4) = 4

‘For Eachステートメント内の要素を取り出す方の変数はVariant型に設定する。
Dim item As Variant

For Each item In arr
Debug.Print (item)
Next

実行結果

サンプルプロシージャ3

Sub ForEachArray()

Dim Days() As Variant
Days = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31)

Dim Day As Variant
Dim Months As Integer

Months = InputBox("月数を入力して下さい")

For Each Day In Days
    Cells(Day, 1) = Day & "日"
    
    Select Case Months
        Case 4, 6, 9
            If Day = 31 Then
                Exit For
            End If
        Case 2
            If Day = 28 Then
                Exit For
            End If
        End Select
Next Day
        
Dim Sat As Integer
Dim i As Integer
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 Each ステートメントの処理を途中で止める方法

Exit Forを利用する

For Each ステートメントでは要素の最後まで繰り返しが行われます。途中で繰り返しを止めたい時はIfステートメントとExit Forステートメントを利用して処理を抜けることが出来ます。

実際の利用方法

今回は以上となります。

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

ブックマークのすすめ

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

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

2022年12月24日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア 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.6)【その他の演算子】Like演算子 | 現役エンジニア&プログラミングスクール講師

2022年10月31日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア 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.9)【Do Loop】基本編 | 現役エンジニア&プログラミングスクール講師

2022年11月30日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア 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.1)【MsgBox】基本文法編 | 現役エンジニア&プログラミングスクール講師

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