【Excel VBA】FSOでフォルダを中身ごと移動する方法 (.Move)

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メソッドを使います。

  1. **fso.GetFolder("移動元のパス")**で、Folderオブジェクトを取得する。
  2. そのオブジェクトに対し、.Move "移動先の親フォルダパス" を実行する。
  3. (推奨)実行前に、**FolderExists**でエラー条件をチェックする。

.Moveメソッドを使いこなすことで、処理済みデータのアーカイブ化や、日次・月次フォルダの整理といった、ファイルシステムの管理を伴うワークフローを効率的に自動化できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次