Excel VBAを駆使することで、大規模なデータセットの効率的な処理や複数の条件の適用が可能になります。
しかし、ループ処理は誤用するとパフォーマンス低下を招くため、慎重な扱いが求められます。
本稿では、Excel VBAにおける二重ループ及び多重ループの基礎からその応用方法に至るまでを、実践的なサンプルコードと共に解説します。
二重ループの概念
二重ループとは、2つのループを組み合わせてネストすることで、より複雑な条件下での処理を実現する手法です。Excel VBAではこの手法を利用することで、表計算の各セルに対して効率的に操作を行うことが可能です。
サンプルコード
1 2 3 4 5 6 7 8 |
Sub DoubleLoop() Dim i As Integer, j As Integer For i = 1 To 10 For j = 1 To 10 Cells(i, j).Value = i * j Next j Next i End Sub |
この例では、二つの変数iとjを利用して10×10のセル範囲に対し、その積をセルの値として設定しています。
多重ループの定義
多重ループでは、3つ以上のループを使用してより複雑なデータ処理を実現します。
これにより、Excel VBAでの複数条件の適用が可能となります。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub TripleLoop() Dim i As Integer, j As Integer, k As Integer For i = 1 To 10 For j = 1 To 10 For k = 1 To 10 If (i * j * k) Mod 3 = 0 Then Debug.Print i & ", " & j & ", " & k End If Next k Next j Next i End Sub |
このコードは、i、j、kの積が3で割り切れる場合にその値を出力します。
応用編
Excel VBAのループ処理は、データの検索やフィルタリングといった多岐にわたる用途に応用することができます。
データ検索の例
二重ループを使用して、Excelの表からデータを検索することができます。
以下は、検索条件を指定して、データを検索するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub SearchData() ' 変数の宣言 Dim i As Integer, j As Integer, SearchValue As String ' 検索する値を設定 SearchValue = "Apple" ' 行を1から10までループ For i = 1 To 10 ' 列を1から10までループ For j = 1 To 10 ' 現在のセルの値が検索値と一致するかをチェック If Cells(i, j).Value = SearchValue Then ' 一致した場合、メッセージボックスを表示 MsgBox "Found " & SearchValue & " at " & Cells(i, j).Address End If ' 内側のループを終了 Next j ' 外側のループを終了 Next i End Sub |
上記のコードでは、Excelシートの1行目から10行目、1列目から10列目のセルを順番にチェックし、セルの値が「Apple」と一致する場合、そのセルのアドレスをメッセージボックスで表示します。
これにより、指定された範囲内で「Apple」がどのセルに存在するかを確認することができます。
応用例2:データのフィルタリング
多重ループを使用して、Excelの表からデータをフィルタリングすることができます。
以下は、フィルタ条件を指定して、データをフィルタリングするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub FilterData() ' 変数の宣言 Dim i As Integer Dim j As Integer Dim k As Integer ' 行を1から10までループ For i = 1 To 10 ' 列を1から10までループ For j = 1 To 10 ' 深さを1から10までループ For k = 1 To 10 ' i * j * k の結果が100より大きく、150未満の場合 If (i * j * k) > 100 And (i * j * k) < 150 Then ' 該当するセルの背景色を赤色に変更 Cells(i, j).Interior.Color = RGB(255, 0, 0) End If ' 深さのループを終了 Next k ' 列のループを終了 Next j ' 行のループを終了 Next i End Sub |
このコードでは、i、j、kの3つの変数を使用して、全てのセルを処理しています。
i、j、kの値を掛け算して、その結果が100以上150未満の場合は、そのセルの背景色を赤色に変更します。
まとめ
この記事では、Excel VBAの二重ループ・多重ループの基礎から応用までを学び、実務で使えるサンプルコードを提供しました。
二重ループ・多重ループを使用することで、大量のデータを処理することができます。
また、応用例として、データの検索やフィルタリングにも使用することができます。
Excel VBAを使って、より高度なプログラミングを行うためには、二重ループ・多重ループを理解することは非常に重要で。
ぜひ、本記事を参考にして、Excel VBAの二重ループ・多重ループをマスターしましょう。
おまけのサンプルコード
特定条件に合致するデータを抽出する多重ループのサンプルコード
例えば、Excelシート上に複数のデータがあり、そのうち特定の条件を満たすデータを抽出したい場合を考えます。
A列には商品名、B列には単価、C列には数量、D列には販売日時が記載されているとします。
この場合、特定の期間内の販売数量を合計して、合計が一定数以上の商品名と、その合計数量を抽出するVBAコードは以下のようになります。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Sub SearchSalesData() Dim startDate As Date Dim endDate As Date Dim targetQuantity As Long Dim totalQuantity As Long '検索条件を設定する startDate = #2022/01/01# '開始日を設定する endDate = #2022/01/31# '終了日を設定する targetQuantity = 1000 '目標数量を設定する '検索結果を記録するための変数を初期化する Dim result As String result = "" 'データを検索する Dim i As Long Dim j As Long For i = 2 To Range("A" & Rows.Count).End(xlUp).Row totalQuantity = 0 If Range("D" & i).Value >= startDate And Range("D" & i).Value <= endDate Then '日付が検索条件に合致するかを確認する For j = i To Range("A" & Rows.Count).End(xlUp).Row If Range("A" & i).Value = Range("A" & j).Value Then '注文番号が同じかを確認する totalQuantity = totalQuantity + Range("C" & j).Value '数量を加算する Else Exit For '注文番号が異なる場合、ループを抜ける End If Next j If totalQuantity >= targetQuantity Then '目標数量以上の場合、検索結果に追加する result = result & Range("A" & i).Value & ": " & totalQuantity & vbCrLf End If i = j - 1 End If Next i '検索結果を表示する If result <> "" Then MsgBox result Else MsgBox "条件を満たすデータはありません。" End If End Sub |
このコードでは、外側のループで販売日時の範囲をチェックし、内側のループで商品名が一致するデータの数量を合計します。
合計が条件に合致した場合は、商品名と合計数量を変数resultに追記し、最後にMsgBoxで表示します。
コメント