【VBA】フォルダの移動(名前変更)する方法
更新日:2024/01/18
VBAで既存フォルダを移動する方法をお伝えします。
フォルダを移動する関数とメソッド
VBAでフォルダを移動する方法は3つあります。
- Name関数
- FileSystemObjectオブジェクトのMoveFolderメソッド
- FolderオブジェクトのMoveメソッド
基本的には、1のName関数を使用します。
Name関数はファイルの名前を変更する関数ですが、実質的には移動と意味合いが同じです。
ただし、ドライブをまたぐ名前変更ができません。
2と3はドライブをまたぐ移動も可能です。
2のMoveFolderメソッドは、複数のフォルダを一括で他のフォルダ内に移動することができます。
3のMoveメソッドは、Folderオブジェクト内に含まれている更新日付やサイズ等のフォルダ情報を使用できます。
移動前にこれらの情報を確認する必要があるときは、Moveメソッドを使用します。
そのため3のMoveメソッドを使用する必要が無いケースがあります。
VBA関数でのフォルダ情報取得については、次のページをご覧ください。
■【VBA】フォルダの情報をサクッと取得する方法
Name関数
Name関数は、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。
ファイルおよびフォルダの名前を変更します。
構文
Name Oldpathname As Newpathname
VBAの一般的な関数呼び出しと異なり、新旧のファイル名の間に "As" を記述します。
- Oldpathname: 名前変更前のフォルダパス
- Newpathname: 名前変更後のフォルダのパス
変更前のフォルダが存在しないまたはフォルダ内のファイルが使用中(開いている)時や、変更後のファイルまたはフォルダが存在するときは、エラーが発生します。
また、異なるドライブを指定するとエラーになります。
使用例
Name関数の使用例です。
ファイルが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。
Sub nameSample()
Const folderName As String = "C:\Users\xxx\Documents\folder1"
Const newFolderName As String = "C:\Users\xxx\Documents\folder2"
On Error GoTo ErrorHandler
Name folderName As newFolderName
MsgBox "名前を変更しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
MoveFolderメソッド
MoveFileメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。
FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。
Dim fso As New Scripting.FileSystemObject
参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。
構文
FileSystemObjectオブジェクト.MoveFolder Source, Destination
- Source: 移動元フォルダのパス
- Destination: 移動先フォルダのパス
Source(移動元)の最後のフォルダ名にワイルドカードを含むことができます。
ワイルドカードを含むときは、Destination(移動先)は既存のフォルダを指定します。
移動先フォルダが存在しないときはエラーです。
ワイルドカードを含まない時に Destination(移動先)フォルダが存在すると、エラーです。
次の二つのパターンで、指定します。
1.フォルダからフォルダへ移動 例 source: \移動元フォルダ destination: \存在しないフォルダ 2.ワイルドカード指定フォルダからフォルダへ移動 例 source: \移動元フォルダ* destination: \既存フォルダ
ワイルドカードで他フォルダ内へ移動する場合は、1フォルダずつ処理されます。
そして何らかの原因で処理できないとき、その時点でエラーになります。
従って失敗時でも、一部のフォルダが移動している可能性があります。
使用例
MoveFolderメソッドの使用例です。
次のコードは"folder?"に一致するフォルダを、dstfolderフォルダに移動しています。
Sub copyFileSample()
Const sourceFolder As String = "C:\Users\xxx\Documents\folder?"
Const destinationFolder As String = "C:\Users\xxx\Documents\dstfolder"
Dim fso As New Scripting.FileSystemObject
On Error GoTo ErrorHandler
fso.MoveFolder sourceFolder, destinationFolder
MsgBox "移動しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
Moveメソッド
MoveメソッドはFolderオブジェクトのメンバーです。
Folderオブジェクトは、FileSystemObjectオブジェクトのGetFolderメソッドで取得します。
構文
set Folderオブジェクト = FileSystemObjectオブジェクト.GetFolder( FolderPath ) Folderオブジェクト.Move Destination
- FolderPath: 移動元フォルダのパス
- Destination: 移動先フォルダのパス
移動先フォルダが存在する場合、エラーです。
移動元フォルダのパスはワイルドカード指定できません。
使用例
Moveメソッドの使用例です。
次のコードはフォルダの作成日時が2022/5/20以前のとき、名前を変更しています。
Sub copySample()
Const sourceFolder As String = "C:\Users\xxx\Documents\folder1"
Const destinationFolder As String = "C:\Users\xxx\Documents\folder2"
Dim fso As New Scripting.FileSystemObject
Dim fo As Folder
On Error GoTo ErrorHandler
Set fo = fso.GetFolder(sourceFolder)
If fo.DateCreated < #5/20/2022# Then
fo.Move destinationFolder
End If
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
Moveを実行しても、Folderオブジェクトは移動前のファイル情報を保持します。
移動前のフォルダは存在しないため、Move実行後はDeleteやCopyなどのメソッドを使用できません。
更新日:2024/01/18
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。