VBAマクロで、月次処理が終わったフォルダを「処理済み」フォルダに移動させたり、プロジェクトフォルダをバックアップ用の場所に移動させたりと、フォルダそのものを中身ごと移動させたい場合があります。
FileSystemObject (FSO)
の**.Move
メソッド**を使えば、フォルダと、その中に含まれる全てのファイルやサブフォルダを、一つの命令で簡単に移動させることができます。
この記事では、FSOを使ってフォルダを移動させる基本的な方法と、エラーを防ぐための注意点を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、「Inbox」というフォルダを、同じ階層にある「Archive」というフォルダの中に移動させるVBAコードです。
VB.Net
'参照設定: Microsoft Scripting Runtime
Sub MoveFolderWithFSO()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim sourceFolder As Folder
Dim sourceFolderPath As String
Dim destinationFolderPath As String
'--- 設定 ---
' 移動したいフォルダのパス
sourceFolderPath = ThisWorkbook.Path & "\Inbox"
' 移動先の親フォルダのパス
destinationFolderPath = ThisWorkbook.Path & "\Archive\"
'--- 設定ここまで ---
'--- 1. 移動元・移動先の存在を確認 ---
If Not fso.FolderExists(sourceFolderPath) Then
MsgBox "移動元のフォルダが見つかりません。" & vbCrLf & sourceFolderPath, vbCritical
Exit Sub
End If
If Not fso.FolderExists(destinationFolderPath) Then
' 移動先フォルダがなければ作成する
fso.CreateFolder destinationFolderPath
End If
' 移動先に同名フォルダがあればエラーになるためチェック
If fso.FolderExists(destinationFolderPath & fso.GetFileName(sourceFolderPath)) Then
MsgBox "移動先に同名のフォルダが既に存在します。", vbCritical
Exit Sub
End If
'--- 2. 移動させたいフォルダのオブジェクトを取得 ---
Set sourceFolder = fso.GetFolder(sourceFolderPath)
'--- 3. .Moveメソッドでフォルダを移動 ---
sourceFolder.Move Destination:=destinationFolderPath
MsgBox "フォルダ「" & sourceFolder.Name & "」を" & vbCrLf & _
"「" & destinationFolderPath & "」に移動しました。"
' オブジェクトを解放
Set sourceFolder = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
Folder
オブジェクトの .Move
メソッド
移動したいフォルダオブジェクト.Move 移動先のフォルダパス
.Move
メソッドは、fso.GetFolder
で取得したFolder
オブジェクトに対して実行します。このメソッドを実行すると、フォルダとその中に含まれるすべてのファイルとサブフォルダが、再帰的に指定した場所へ移動します。
元の場所からは、フォルダは完全に削除されます(コピーではなく移動です)。
Destination
引数(移動先のパス)
引数で指定する移動先のパスは、**「どのフォルダの中に移動させたいか」**という親フォルダのパスを指定します。
sourceFolder.Move Destination:="C:\Archive\"
このコードは、sourceFolder
オブジェクトが示すフォルダを、C:\Archive\
というフォルダの中に移動させます。
【重要】エラーを防ぐための注意点
フォルダの.Move
メソッドは、以下の条件で実行時エラーを発生させます。
- 移動元のフォルダが存在しない。
- 移動先の親フォルダが存在しない。
- 移動先に、既に同名のフォルダ(またはファイル)が存在する。
そのため、Move
メソッドを実行する前には、サンプルコードのように**fso.FolderExists
**を使って、移動元と移動先の状態を事前にチェックするのが、堅牢なマクルを作成するための定石です。移動先のフォルダが存在しない場合は、fso.CreateFolder
で作成してあげると親切な設計になります。
まとめ
FSOでフォルダごと移動するには、Folder
オブジェクトの.Move
メソッドを使います。
- **
fso.GetFolder("移動元のパス")
**で、Folder
オブジェクトを取得する。 - そのオブジェクトに対し、
.Move "移動先の親フォルダパス"
を実行する。 - (推奨)実行前に、**
FolderExists
**でエラー条件をチェックする。
.Move
メソッドを使いこなすことで、処理済みデータのアーカイブ化や、日次・月次フォルダの整理といった、ファイルシステムの管理を伴うワークフローを効率的に自動化できます。