【ExcelVBA】ループ処理の中断・再開を外部ファイルの有無で制御する方法とは

この記事では、ループ処理の中断・再開を外部ファイルの有無で制御する方法についてご説明します。

【動画】ループ処理の中断・再開を外部ファイルの有無で制御する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


大量のフォルダを繰り返しコピーしているループ処理を、テキストファイルの有無で制御(中断・再開)しています。

動画では、「stop.txt」というファイルが存在していればコピーしているループ処理を中断し、無ければコピーしているループ処理を再開します。

マクロ作成の流れ

STEP.1
ループ処理内に一つループ処理を追加する
ループ処理内に一つループ処理を追加します。
STEP.2
STEP.1で追加したループの終了条件に、ループ処理用ファイルが存在しているかを判定させる
STEP.1で追加したループの終了条件に、ループ処理用ファイルが存在しているかを判定させます。
ループ処理用ファイルが存在していればSTEP.1で追加したループを抜け追加元のループ処理を再度行い、存在していなければSTEP.1で追加したループを継続します。

コードの例

Excelのマクロのコード(例)

補足
今回の記事では「ループ処理の中断・再開を外部ファイルの有無で制御する」のが本題ですが、このループ処理に「フォルダのコピー」を採用しています。(28行目から35行目)
なので、「フォルダのコピー」の部分は本題とは逸れている処理なので参考程度にコードを見て頂ければ幸いです。

フォルダのコピー処理
        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」ボタンをクリックします。

  1. 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のスキルや基礎」を学ぶのにおすすめですよ。

→ 受講後、何度でも無期限でメールで質問できるアフターサポートがついているExcelマスター講座はこちら