この記事では、ループ処理の中断・再開を外部ファイルの有無で制御する方法についてご説明します。
【動画】ループ処理の中断・再開を外部ファイルの有無で制御する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
大量のフォルダを繰り返しコピーしているループ処理を、テキストファイルの有無で制御(中断・再開)しています。
動画では、「stop.txt」というファイルが存在していればコピーしているループ処理を中断し、無ければコピーしているループ処理を再開します。
マクロ作成の流れ
ループ処理用ファイルが存在していればSTEP.1で追加したループを抜け追加元のループ処理を再度行い、存在していなければSTEP.1で追加したループを継続します。
コードの例
Excelのマクロのコード(例)
なので、「フォルダのコピー」の部分は本題とは逸れている処理なので参考程度にコードを見て頂ければ幸いです。
If (fso.FolderExists(fldr & "\" & copyFlder) = False) Then 'フォルダ内にコピー元のフォルダが存在しない場合 'コピー元のフォルダをコピーする fso.CopyFolder ThisWorkbook.Path & "\" & copyFlder, fldr & "\" End If
Option Explicit Sub test() Dim fso As FileSystemObject 'FileSystemObjectのインスタンス用変数 Dim fldr As Folder 'フォルダ用変数 'ループ処理中断用ファイルがある場合はループ処理を中断する Const sFile As String = "stop.txt" 'コピーするフォルダ名を取得する Const copyFlder As String = "data" 'FileSystemObjectのインスタンスを生成する Set fso = CreateObject("Scripting.FileSystemObject") 'フォルダ配下にあるデータが入力されているExcelファイルの数分ループさせる For Each fldr In fso.GetFolder(ThisWorkbook.Path & "\" & "test").SubFolders 'ループ処理中断用ファイルの有無判定を行うループ Do DoEvents 'ループ処理中断用ファイルがある場合はDoループを抜ける(無い間はループを抜けない) Loop While (Dir(ThisWorkbook.Path & "\" & sFile) <> "") If (fso.FolderExists(fldr & "\" & copyFlder) = False) Then 'フォルダ内にコピー元のフォルダが存在しない場合 'コピー元のフォルダをコピーする fso.CopyFolder ThisWorkbook.Path & "\" & copyFlder, fldr & "\" End If Next fldr End Sub
注目すべきコード①
最初に見て頂きたいのは8行目です。
'ループ処理中断用ファイルがある場合はループ処理を中断する Const sFile As String = "stop.txt"
以上のコードは、ループ処理を中断するかを判断するためのファイル名を取得するコードです。
ファイル「stop.txt」が、ループ処理を中断するかを判断するためのファイル名になります。
ファイル「stop.txt」が存在している場合はループ処理を中断し、存在しなければループ処理を再開します。
注目すべきコード②
次に見て頂きたいのは20行目です。
'ループ処理中断用ファイルの有無判定を行うループ Do DoEvents 'ループ処理中断用ファイルがある場合はDoループを抜ける(無い間はループを抜けない) Loop While (Dir(ThisWorkbook.Path & "\" & sFile) <> "")
以上のコードは、ループ処理の中断・再開を外部ファイルの有無で制御する処理のコードです。
Doループの終了条件は「注目すべきコード①」で紹介した、ループ処理を中断するかを判断するためのファイル「stop.txt」が存在しない場合です。
このループを抜けない限りループ処理(今回のサンプルでは18行目のFor文)は中断されたままとなり、ずっとDoのループを繰り返します。
ファイル「stop.txt」がもし存在する場合はDoループから抜けるので、大元のループ処理が再開されます。
なので、ファイル「stop.txt」の有無でループ処理の中断・再開を制御することができます。
動作確認
マクロ実行前
以下のフォルダを繰り返しフォルダにコピーしていきます。
マクロ実行前はループ処理中断用ファイルが無い状態にしてあります。
マクロ実行中(ループ処理中断用ファイルが無い状態)
ループ処理中断用ファイルが無い状態だとフォルダが次々にコピーされていきます。
マクロ実行中(ループ処理中断用ファイルがある状態)
ループ処理中断用ファイルがある状態だとフォルダがコピーされなくなります(フォルダのコピー中断)。
マクロ実行中(ループ処理中断用ファイルを削除後)
ループ処理中断用ファイルを削除すると再度フォルダがコピーされていきます(フォルダのコピー再開)。
【注意】参照設定が必要です
一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。
参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。
- Windows Script Host Object Model(wshom.ocx)
なぜ必要かというと、Excelのマクロのコードの16行目の「FileSystemObject」というオブジェクトが「wshom.ocx」というファイルを参照するからです。
Dim fso As FileSystemObject 'FileSystemObjectのインスタンス用変数
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。
最後に
本記事では、ループ処理の中断・再開を外部ファイルの有無で制御する方法についてご説明しました。
今回はループ処理の中断・再開を制御する説明をしてきましたが、条件分けとして外部ファイルを参照する手法はほかにも応用ができるかと思います。(外部ファイルの有無でAのルートBのルートに分ける、みたいな感じで)
今回はマクロ内やExcelファイル以外でもループ処理の中断・再開させることができることを例に挙げて説明しましたが、条件分けを行うのになにかしらのヒントとして本記事を参考にしていただけたら幸いです。
Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら
Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。
Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。