VBAマクロで特定のファイルを処理した後、そのファイルを「処理済み」フォルダに移動させて整理したい、という場面は非常に多くあります。
FileSystemObject (FSO)
の**.Move
メソッド**を使えば、ファイルの移動を簡単かつ確実に行うことができます。この記事では、FSOを使ってファイルを移動させる基本的な方法と、エラーを防ぐための注意点を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、「Inbox」というサブフォルダにある「Data_A.xlsx」というファイルを、さらにその中の「Processed」フォルダに移動させるVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub MoveFileWithFSO()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim sourceFile As File
Dim sourceFilePath As String
Dim destinationFolderPath As String
'--- 設定 ---
sourceFilePath = ThisWorkbook.Path & "\Inbox\Data_A.xlsx"
destinationFolderPath = ThisWorkbook.Path & "\Inbox\Processed\"
'--- 設定ここまで ---
'--- 1. 移動元ファイルと、移動先フォルダの存在を確認 ---
If Not fso.FileExists(sourceFilePath) Then
MsgBox "移動元のファイルが見つかりません。" & vbCrLf & sourceFilePath, vbCritical
Exit Sub
End If
If Not fso.FolderExists(destinationFolderPath) Then
MsgBox "移動先のフォルダが見つかりません。先に作成してください。", vbCritical
Exit Sub
End If
'--- 2. 移動させたいファイルのオブジェクトを取得 ---
Set sourceFile = fso.GetFile(sourceFilePath)
'--- 3. .Moveメソッドでファイルを移動 ---
sourceFile.Move destinationFolderPath
MsgBox "ファイル「" & sourceFile.Name & "」を" & vbCrLf & _
"「" & destinationFolderPath & "」に移動しました。"
' オブジェクトを解放
Set sourceFile = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
File
オブジェクトの .Move
メソッド
移動したいファイルオブジェクト.Move 移動先のパス
このコードの核心部分です。まず、fso.GetFile
で移動させたいファイルのFile
オブジェクトを取得します。次に、そのオブジェクトの.Move
メソッドを実行することで、ファイルを指定した場所に移動させます。
.Move
メソッドの引数(移動先のパス)の指定方法によって、2つの動作があります。
1. 移動先のパスに「フォルダ」を指定した場合
sourceFile.Move "C:\MyProject\Archive\"
この場合、ファイルは元の名前を維持したまま、指定されたフォルダの中に移動します。
2. 移動先のパスに「フルパス(フォルダ+新しいファイル名)」を指定した場合
sourceFile.Move "C:\MyProject\Archive\Data_A_Processed.xlsx"
この場合、ファイルは指定されたフォルダに移動すると同時に、ファイル名が変更されます。「移動と名前の変更」を一度に行うことができます。
【重要】エラーを防ぐための注意点
.Move
メソッドは、以下の条件で実行時エラーを発生させます。
- 移動元のファイルが存在しない。
- 移動先のフォルダが存在しない。
- 移動先に、既に同名のファイルが存在する。
そのため、Move
メソッドを実行する前には、サンプルコードのように**fso.FileExists
やfso.FolderExists
**を使って、移動元と移動先の状態を事前にチェックするのが、堅牢なマクロを作成するための定石です。
【応用】フォルダ内のファイルをすべて移動する
このテクニックを応用すれば、指定したフォルダ内にあるファイルを、すべて別のフォルダへ一括で移動する処理も簡単に記述できます。
Sub MoveAllFilesInFolder()
Dim fso As New FileSystemObject
Dim sourceFolder As Folder
Dim f As File
Set sourceFolder = fso.GetFolder(ThisWorkbook.Path & "\Inbox")
' フォルダ内の全ファイルをループ
For Each f In sourceFolder.Files
' 1つずつ「Processed」フォルダに移動
f.Move ThisWorkbook.Path & "\Inbox\Processed\"
Next f
MsgBox "すべてのファイルを移動しました。"
End Sub
まとめ
FSOでファイルを移動するには、File
オブジェクトの.Move
メソッドを使います。
- **
fso.GetFile("移動元のパス")
**で、File
オブジェクトを取得する。 - そのオブジェクトに対し、
.Move "移動先のパス"
を実行する。 - (推奨)実行前に、**
FileExists
やFolderExists
**でエラー条件をチェックする。
.Move
メソッドを使いこなすことで、ファイルの整理や、処理済みデータのアーカイブといったワークフローの自動化が、より柔軟に行えるようになります。