
【ファイル付き】コピペで使えるExcelマクロ!ファイルの保存場所を一括で移動するマクロの使い方
今回の記事では、Excel VBAを用いてフォルダ内のファイル一覧を取得し、それらのファイルを指定フォルダに移動する一連のマクロについてご紹介します。このプロジェクトには、3つの関連するマクロが含まれており、特にフォルダパスの取得が分からない方にも使いやすいように工夫されています。以下の章立てに沿って、それぞれのマクロの概要やコードの解説、実際の使用方法をご説明します。
Excelマクロの基本的な使い方は、下の記事を参考にしてください
1. マクロの概要
このプロジェクトには大きく分けて3つのマクロが登場します。
SelectFolderAndListAllFiles
ユーザーにフォルダを選択させ、そのフォルダ内およびサブフォルダ内のすべてのファイルをリスト化するマクロです。取得したファイルパスはアクティブシートのA列に記録されます。MoveFilesWithLogging
1つ目のマクロで取得したファイル一覧を基に、ファイルを指定されたフォルダに移動するマクロです。移動の際に重複が発生する場合は連番を付与し、処理結果をログとしてC列に記録します。ShowFolderPath
補助的なマクロで、フォルダ選択ダイアログを表示し、選択したフォルダパスをシートのセルE2に表示します。これにより、フォルダパスをコピーして他のセルやマクロで使用できるようになります。
この3つのマクロは連携して動作します。まず1つ目のマクロでファイル一覧を取得し、次に2つ目のマクロでファイル移動を行う想定です。その際、必要に応じて3つ目のマクロを利用してフォルダパスを確認することができます。

2. コードの説明
以下が実際に使用するコードです。
2種類のコード両方を使用します。必要に応じて3つ目のコードも使用します
このコードをコピーして、標準モジュールに貼り付けるだけで使用可能です。
コードをどうやって貼り付けて使用していいかわからない方は、この記事の上部に、Excelマクロの基本操作の記事のリンクを貼っているためそちらを参照してください。
1つ目のコード
Sub SelectFolderAndListAllFiles()
Dim folderDialog As FileDialog
Dim selectedFolderPath As String
Dim fileSystemObject As Object
Dim folder As Object
Dim ws As Worksheet
Dim lastRow As Long
' アクティブなシートを設定
Set ws = ThisWorkbook.ActiveSheet
' フォルダ選択ダイアログを表示
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
With folderDialog
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
If .Show = -1 Then
selectedFolderPath = .SelectedItems(1)
Else
MsgBox "フォルダが選択されませんでした。", vbExclamation
Exit Sub
End If
End With
' ファイルシステムオブジェクトを使用してファイルを取得
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")
Set folder = fileSystemObject.GetFolder(selectedFolderPath)
' A列の最後の空白行を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
' サブフォルダを含むすべてのファイル情報をリストアップ
Call ListFilesRecursive(folder, ws, lastRow)
MsgBox "フォルダ内およびサブフォルダ内のすべてのファイル情報を取得しました。", vbInformation
End Sub
Sub ListFilesRecursive(targetFolder As Object, ws As Worksheet, ByRef lastRow As Long)
Dim file As Object
Dim subFolder As Object
' フォルダ内のすべてのファイルのフルパスをリストアップ
For Each file In targetFolder.Files
ws.Cells(lastRow, 1).Value = file.Path ' フルパスを取得して記録
lastRow = lastRow + 1
Next file
' サブフォルダを再帰的に処理
For Each subFolder In targetFolder.SubFolders
Call ListFilesRecursive(subFolder, ws, lastRow)
Next subFolder
End Sub
2つ目のコード
Sub MoveFilesWithLogging()
Dim ws As Worksheet
Dim lastRow As Long
Dim srcPath As String
Dim destFolder As String
Dim destPath As String
Dim fileName As String
Dim newFileName As String
Dim fileExt As String
Dim counter As Integer
Dim fso As Object
Dim logMessage As String
' ワークシートと範囲の設定
Set ws = ThisWorkbook.Sheets(1) ' 1枚目のシートを想定
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set fso = CreateObject("Scripting.FileSystemObject")
' 2行目から最終行までループ
For i = 2 To lastRow
srcPath = ws.Cells(i, "A").Value
destFolder = ws.Cells(i, "B").Value
logMessage = ""
If fso.FileExists(srcPath) Then
If fso.FolderExists(destFolder) Then
' ファイル名と拡張子を取得
fileName = fso.GetFileName(srcPath)
fileExt = fso.GetExtensionName(srcPath)
destPath = fso.BuildPath(destFolder, fileName)
' 移動先に同名ファイルがある場合は連番をつける
newFileName = fileName
counter = 1
While fso.FileExists(destPath)
newFileName = Replace(fileName, "." & fileExt, "(" & counter & ")." & fileExt)
destPath = fso.BuildPath(destFolder, newFileName)
counter = counter + 1
Wend
' ファイルを移動
On Error Resume Next
fso.MoveFile srcPath, destPath
If Err.Number = 0 Then
logMessage = "成功: " & newFileName
If counter > 1 Then
logMessage = logMessage & "(重複していたため連番を付加)"
End If
Else
logMessage = "失敗: ファイルを移動できませんでした"
End If
On Error GoTo 0
Else
logMessage = "失敗: 移動先のフォルダが見つかりません"
End If
Else
logMessage = "失敗: ファイルが見つかりません"
End If
' C列にログメッセージを記入
ws.Cells(i, "C").Value = logMessage
Next i
' 後処理
Set fso = Nothing
MsgBox "処理が完了しました。", vbInformation
End Sub
3つ目のコード
Sub ShowFolderPath()
' フォルダ選択ダイアログ用の変数
Dim folderPicker As FileDialog
Dim selectedFolderPath As String
' フォルダ選択ダイアログを作成
Set folderPicker = Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログの設定
With folderPicker
.Title = "フォルダを選択してください"
.AllowMultiSelect = False ' 複数選択を無効化
' ユーザーがフォルダを選択した場合
If .Show = -1 Then
selectedFolderPath = .SelectedItems(1) ' 選択されたフォルダパスを取得
' E2セルにパスを表示
ThisWorkbook.Sheets(1).Range("E2").Value = selectedFolderPath
Else
MsgBox "フォルダが選択されませんでした。", vbExclamation, "選択キャンセル"
End If
End With
' オブジェクトを解放
Set folderPicker = Nothing
End Sub
3. 使い方
これらのマクロを利用する手順は以下の通りです。
マクロの準備: ExcelのVBAエディタを開き、上記の3つのマクロのコードを適切なモジュールに貼り付けます。
フォルダの選択とファイル一覧の取得
まず、SelectFolderAndListAllFiles マクロを実行します。実行するとフォルダ選択ダイアログが表示されるので、対象のフォルダを選択します。
選択されたフォルダ内およびサブフォルダ内のすべてのファイルのパスが、アクティブシートのA列にリストされます。
フォルダパスの確認(必要に応じて)
次に、ShowFolderPath マクロを実行して、フォルダパスをセルE2に表示します。表示されたパスをコピーして、移動先フォルダの指定などに利用することができます。
特にフォルダパスの取得方法が分からない場合、この手順を使うと便利です。
ファイルの移動
MoveFilesWithLogging マクロを実行します。このマクロは、A列にリストされたファイルを、対応するB列に指定されたフォルダへ移動します。
移動の結果やエラーについては、C列にログとして表示されます。
同じファイル名が存在する場合は、自動的に連番が付与されてリネームされます。
結果の確認
ファイルが正しく移動されているか、シート上のログ(C列)を確認します。
エラーが発生した場合は、ログメッセージをもとに対処します。
4. ファイルの配布
実際のファイルも置いておきます。これをダウンロードして使用することも可能です。
5. まとめ
この記事では、Excel VBAを使用してフォルダ内のファイル一覧を取得し、それらを別のフォルダに移動する一連のマクロについて紹介しました。
SelectFolderAndListAllFiles マクロでファイルリストを取得し、
補助的な ShowFolderPath マクロでフォルダパスをセルに表示し、
MoveFilesWithLogging マクロでファイルの移動とログ記録を行います。
この3つのマクロを組み合わせることで、フォルダ内のファイル管理がより効率的に行えるようになります。特にフォルダパスの取得や重複ファイルの扱いに配慮した設計になっているため、初心者の方でも安心して使用できます。ぜひ、自分の環境に合わせて応用してみてください。
この記事で紹介したマクロをさらにカスタマイズしたい場合や、エラーが発生する場合は、お気軽にコメントをお寄せください!
※本記事で紹介しているマクロやファイルの使用に伴い発生したいかなるトラブルや損害についても、当方では一切の責任を負いかねます。すべて自己責任のもとでご利用ください。