この記事では、指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する方法についてご説明します。
【動画】指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
ファイルの置き場にあるファイルに対して、ファイル名に対象の文字列が含まれるかを判定します。
判定した結果、該当したファイルに対してはMoveFileメソッドを実行して移動先のフォルダにファイルを移動しています。
マクロ作成の流れ
Excelファイルの例
今回は次のExcelファイルを用意しました。
- findStr:ファイル名に含まれる検索したい文字列を入力します
- fileLocation:ファイルの置き場をフルパスで入力します
- 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」ボタンをクリックします。
- Windows Script Host Object Model(wshom.ocx)
なぜ必要かというと、Excelのマクロのコードの11行目の「FileSystemObject」というオブジェクトが「wshom.ocx」というファイルを参照するからです。
'FileSystemObjectのインスタンスを生成する Set fso = New FileSystemObject
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。
最後に
この記事では、指定した文字(列)が含まれるファイルだけ指定のフォルダに移動する方法についてご説明しました。
一つのフォルダ内にある、特定の文字列が含まれたファイルだけを移動させたい場合に、今回紹介したマクロが役立つかもしれないので参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。