【ExcelVBA】指定した文字(列)が含まれるファイルだけ指定のフォルダに移動するには

この記事では、指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する方法についてご説明します。

【動画】指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する実際の動き

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


ファイルの置き場にあるファイルに対して、ファイル名に対象の文字列が含まれるかを判定します。

判定した結果、該当したファイルに対してはMoveFileメソッドを実行して移動先のフォルダにファイルを移動しています。

マクロ作成の流れ

STEP.1
ファイルの置き場にあるファイルに対して対象の文字列が含まれているか判定する
ファイルの置き場にあるファイルに対して対象の文字列が含まれているか判定します。
STEP.2
対象の文字列が含まれているか場合は、ファイルの移動先にファイルを移動する
対象の文字列が含まれているか場合は、ファイルの移動先にファイルを移動します。

Excelファイルの例

今回は次のExcelファイルを用意しました。

  1. findStr:ファイル名に含まれる検索したい文字列を入力します
  2. fileLocation:ファイルの置き場をフルパスで入力します
  3. mvToPath:ファイルを移動させたいフォルダをフルパスで入力します

コードの例

Option Explicit

Sub test()

    Dim fileFolder          As String               '元のファイルがあるフォルダのパスを格納する変数
    Dim moveToFolder        As String               '移動先のフォルダのパスを格納する変数
    Dim fileName            As String               'ファイル名を格納する変数
    Dim findStr             As String               '検索する文字列を格納する変数
    Dim fso                 As FileSystemObject     'FileSystemObjectのインスタンス用変数
    Dim ws                  As Worksheet            'シート用変数
    
    'FileSystemObjectのインスタンスを生成する
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    'シートを取得する
    Set ws = Worksheets("work")
        
    If Right(ws.Range("fileLocation").Value, 1) <> "\" Then
    
        '入力された「ファイルの置き場」のフルパスの末尾に「\」が付いていない場合
                
        '「ファイルの置き場」のフルパスの末尾に「\」を付けて、フルパスを変数SourceFolderに格納する
        fileFolder = ws.Range("fileLocation").Value & "\"
        
    Else
    
        '入力された「ファイルの置き場」のフルパスの末尾に「\」が付いている場合
    
        '「ファイルの置き場」のフルパスを変数SourceFolderに格納する
        fileFolder = ws.Range("folderCopyTo").Value
        
    End If    
    
    If Right(ws.Range("mvToPath").Value, 1) <> "\" Then
    
        '入力された「ファイルの移動先」のフルパスの末尾に「\」が付いていない場合
                
        '「ファイルの移動先」のフルパスの末尾に「\」を付けて、フルパスを変数SourceFolderに格納する
        moveToFolder = ws.Range("mvToPath").Value & "\"
        
    Else
    
        '入力された「ファイルの移動先」のフルパスの末尾に「\」が付いている場合
    
        '「ファイルの移動先」のフルパスを変数SourceFolderに格納する
        moveToFolder = ws.Range("mvToPath").Value
        
    End If
    
    '検索する文字列を取得し、findStrに格納
    findStr = ws.Range("findStr").Value
    
    '対象の文字列が含まれているファイル名をワイルドカードで取得する
    fileName = Dir(fileFolder & "\*" & findStr & "*")
    
    '対象の文字列が含まれているファイルの数だけループするDo文
    Do While fileName <> ""
        
        If InStr(fileName, findStr) > 0 Then
        
            '対象の文字列がfileNameに含まれる場合
        
            'ファイルを移動する
            fso.MoveFile fileFolder & fileName, moveToFolder & fileName
            
        End If
        
        '次のファイル名を取得する
        fileName = Dir()
        
        DoEvents
        
    Loop
    
    '後処理
    Set fso = Nothing
    
End Sub

注目すべきコード①

最初に見て頂きたいのは8行目です。

    'FileSystemObjectのインスタンスを生成する
    Set fso = CreateObject("Scripting.FileSystemObject")

コードの説明

以上のコードは、FileSystemObjectのインスタンスを生成を生成するコードです。

FileSystemObjectのインスタンスは、ファイルの移動を行うためのMoveFileメソッドを実行するのに必要です。

注目すべきコード②

次に見て頂きたいのは55行目です。

    '対象の文字列が含まれているファイル名をワイルドカードで取得する
    fileName = Dir(fileFolder & "\*" & findStr & "*")

コードの説明

以上のコードは、対象の文字列が含まれているファイル名をワイルドカードで取得するコードです。

ファイルの置き場にあるファイル名に対して、対象の文字列が含まれるファイルを特定するためにワールドカード(*)を使ってDir関数を実行して絞ります。

注目すべきコード③

次に見て頂きたいのは58行目から74行目です。

    '対象の文字列が含まれているファイルの数だけループするDo文
    Do While fileName <> ""
        
        If InStr(fileName, findStr) > 0 Then
        
            '対象の文字列がfileNameに含まれる場合
        
            'ファイルを移動する
            fso.MoveFile fileFolder & fileName, moveToFolder & fileName
            
        End If
        
        '次のファイル名を取得する
        fileName = Dir()
        
        DoEvents
        
    Loop

コードの説明

以上のコードは、「注目すべきコード②」で絞ったファイルに対し、対象の文字列が含まれる場合にファイルの移動先へ移動させる処理のコードです。

コードの詳細

58行目のコードは、「注目すべきコード②」で絞った(変数fileNameに格納されている)ファイルの数分だけ処理を繰り返すFor文です。

変数fileNameには、まずは「注目すべきコード②」で実行された54行目のDir関数で取得されたファイル名が格納されます。

もし2つ以上のファイルがある場合は、2つ目以降は78行目のDir関数が実行されるたびにファイル名が格納されます。

変数fileNameに格納されたファイル名に対象の文字列が含まれるかを60行目で判定し、もし含まれる場合は65行目のMoveFileメソッドを実行してファイルをファイルの移動先に移動させます。

動作確認

今回は以下のフォルダにあるファイルを移動させます。

テスト①:ファイル名に「2021」が含まれるファイルを移動させたい場合

マクロ実行前

Excelファイルの各セルには以下の通りに入力しています。

マクロ実行後

移動元と移動先のそれぞれのフォルダの中身は次の通りです。

対象の文字列が含まれるファイルが移動元から移動先に移動されたことが分かります。

テスト①:ファイル名に「old」が含まれるファイルを移動させたい場合

マクロ実行前

Excelファイルの各セルには以下の通りに入力しています。

マクロ実行後

移動元と移動先のそれぞれのフォルダの中身は次の通りです。

対象の文字列が含まれるファイルが移動元から移動先に移動されたことが分かります。

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどの「fso.CreateFolderメソッドを使って2階層以上のフォルダを作成」する方法の説明で紹介したコードを動かすには参照設定が必要です。

参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。

  1. Windows Script Host Object Model(wshom.ocx)

なぜ必要かというと、Excelのマクロのコードの11行目の「FileSystemObject」というオブジェクトが「wshom.ocx」というファイルを参照するからです。

    'FileSystemObjectのインスタンスを生成する
    Set fso = New FileSystemObject

この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。

ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。

最後に

この記事では、指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する方法についてご説明しました。

一つのフォルダ内にある、特定の文字列が含まれたファイルだけを移動させたい場合に、今回紹介したマクロが役立つかもしれないので参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら