こんにちは、はやぶさです。
日々ExcelやPythonを使って、業務を効率化しています。
前回のExcelマクロとVBA入門シリーズでは、繰り返し処理を扱う「For Nextステートメント」に焦点を当てて解説しました。
今回の続編では、「Do Loopステートメント」を深く掘り下げ、その使い方や実践的な応用例を紹介します。
VBAにおけるプログラミングスキルをさらに向上させたい方々にとって、この記事が貴重な洞察と実用的な知識を提供し、作業のさらなる効率化に役立つことを願っています。
Do Loopステートメントとは?
Do Loopステートメントは、プログラミングで繰り返し処理を実現する基本構造です。指定した条件を満たす間(または満たすまで)指定したコードを繰り返します。
これは、For NextやFor Eachステートメントのような固定回数やコレクションの各要素への処理と異なり、より柔軟な条件下でのループを可能にします。
特に、終了条件が予測不可能なタスク、例えばファイル検索やデータベースクエリなどに適しています。
基本的な使い方
Do Loopステートメントは、繰り返し処理を実装する際に、二つの主要なパターンを提供します。
Do Whileループ
Do Whileループは、「ある条件が真(True)である間」処理を繰り返します。
このタイプのループは、条件がループの開始時にチェックされ、条件が偽(False)になるまで繰り返し実行されます。
基本構文
1 2 3 |
Do While [条件] [繰り返したい処理] Loop |
例
以下のコードでは、「整数が100未満の間」繰り返し処理されます。
1 2 3 4 5 6 |
Dim 整数 As Long 整数 = 0 Do While 整数 < 100 整数 = 整数 + 1 Loop MsgBox 整数 ' 100 |
Do Untilループ
Do Untilループは、「ある条件が真(True)になるまで」処理を繰り返します。
このタイプは、条件がループの終わりに評価され、真になるまで処理が繰り返される点でDo Whileループと異なります。
基本構文
1 2 3 |
Do Until [条件] [繰り返したい処理] Loop |
例
以下のコードでは、「整数が100以上になるまで」繰り返し処理されます。
1 2 3 4 5 6 |
Dim 整数 As Long 整数 = 0 Do Until 整数 >= 100 整数 = 整数 + 1 Loop MsgBox 整数 ' 100 |
ループの終了後に条件をチェックするパターンも可能です。この場合、最低一回はループ内の処理が実行された後で条件が評価されます。
1 2 3 4 5 6 7 |
Do [繰り返したい処理] Loop While [条件] Do [繰り返したい処理] Loop Until [条件] |
Do Loopループを使用する際は、ループの条件に関わる変数の値をコード内で適切に変更することが重要です。この操作を怠ると、無限ループに陥る可能性があります。
1 2 3 4 5 6 |
Dim 整数 As Long 整数 = 0 Do While 整数 < 100 整数 = 整数 + 1 ' ←この部分 Loop MsgBox 整数 ' 100 |
Exit Doの活用
Exit Doステートメントは、条件に応じてループを途中で終了させるために使用されます。
特定の条件が満たされた時点でループ処理を停止させることができるため、IFステートメントなどの条件分岐と共に使用することが一般的です。
1 2 3 4 5 6 7 |
Dim 整数 As Long 整数 = 0 Do While 整数 < 100 整数 = 整数 + 1 If 整数 = 55 Then Exit Do Loop MsgBox 整数 ' 55 |
実践的な例:特定のファイルを検索して開く
以下の例は、フォルダ内からファイル名に「売上実績.xlsx」を含むファイルを検索し、見つかったすべてのファイルを開き、処理実行して閉じるプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim フォルダパス As String, ファイルパス As String, 捜索ファイル名 As String ' 捜索したいフォルダと、ファイル名を指定 フォルダパス = "C:\Users\User\Documents\" ファイルパス = Dir(フォルダパス & "*.*") 捜索ファイル名 = "*売上実績.xlsx" ' フォルダ内のすべてのファイルをループ Do While ファイルパス <> "" ' ファイル名に捜索ファイル名が含まれる場合 If ファイルパス Like 捜索ファイル名 Then ' ファイルを開く Workbooks.Open フォルダパス & ファイルパス ' --- [開いたファイルで実行したい処理] --- ' 保存せずにファイルを閉じる Workbooks(ファイルパス).Close SaveChanges:=False End If ファイルパス = Dir() Loop |
このコードでは以下の手順で処理が行われます:
- Dir関数を用いて指定されたフォルダ内のファイルを一つずつ取得します。
- 取得したファイル名が空白になるまで、つまりフォルダ内のファイルをすべてチェックし終えるまで処理を繰り返します。
- Like演算子を活用して、取得したファイル名が指定したパターンに一致するかどうかを判断します。
- 条件に一致するファイルが見つかった場合、Workbooks.Openメソッドでそのファイルを開きます。
- 開いたファイルで必要な処理を行い、その後ファイルを保存せずに閉じます。
Do Loopと無限ループのリスク
Do Loopを使用すると、終了条件を動的に設定できるため、柔軟なループ処理が可能になります。
しかし、この柔軟性には注意が必要で、不適切な扱いが原因で無限ループに陥ることがあります。
無限ループを回避するポイント
- 終了条件の明確化: 終了条件は明確に設定してください。不明瞭な条件や、ループによって変化しない条件では、プログラムが無限ループに入る可能性があります。
- 変数の適切な更新: ループ終了に影響を与える変数は、ループ内で適切に更新してください。変数の更新がない場合、無限ループの原因となります。
以下のコードは、無限ループの例です。変数にInteger型を指定することで、すぐにオーバーフローエラーにより停止します。
1 2 3 4 5 |
Dim 整数 As Integer Do Until 整数 = 100 整数 = 整数 + 3 Loop MsgBox 整数 |
この例では、整数
が99を超えると102になり、100には決して達しないため、無限に実行されます。
無限ループを実行してしまった場合、ESCキーで停止させるか、最悪の場合プロセスを終了させることが必要です。この状況では、作成中のプログラムが保存できなくなるリスクもあるため、無限ループの発生には特に注意が必要です。
このようなケースを避けるためには、ループの進行や終了条件を慎重に設計します。
1 2 3 4 5 6 |
Dim 整数 As Integer 整数 = 0 Do Until 整数 > 100 整数 = 整数 + 3 Loop MsgBox 整数 ' 102 |
このコードでは、整数が100を超えるとループから抜けます。これにより、無限ループを回避できます。
まとめ
この記事では、Do Loopステートメントについて、基本から応用までを詳しく説明し、使用方法と例を紹介しました。
Do Loopステートメントは、特定の条件を満たす間、または満たすまで指定したコードを繰り返すことで、繰り返し処理を実現します。
この機能は、終了条件が不確定なタスク、例えばファイル検索やデータベースクエリの処理に適しています。
キーポイント
- 基本的な使い方:
- Do Whileループ: 「ある条件が真(True)である間」処理を繰り返します。
- Do Untilループ: 「ある条件が真(True)になるまで」処理を繰り返します。
- Exit Doの活用: 条件に応じてループを途中で終了させるために使用されます。
- 無限ループのリスク: 無限ループに陥ると、プログラムが停止できず、作成中のプログラムが失われる可能性があります。
プログラミングは学習と実践の繰り返しです。諦めずに継続することで、やがては複雑な問題も解決できるようになります。
この記事が、Excel VBAの世界への興味をさらに深め、日々の作業を効率化するためのツールとしてExcelマクロとVBAを活用する一助となることを願っています。