タイマー処理

【VBA】ファイルを移動または名前変更する方法

更新日:2024/01/18

VBAで既存ファイルを移動する方法をお伝えします。

 

ファイルを移動する関数とメソッド

VBAでファイルを移動する方法は3つあります。

基本的には、1のNameステートメントを使用します。
Nameステートメントはファイルの名前を変更する関数ですが、実質的には移動と意味合いが同じです。

2のMoveFileメソッドは、複数のファイルを一括でフォルダに移動することができます。

3のMoveメソッドは、Fileオブジェクト内に含まれている更新日付やサイズ等のファイル情報を使用できます。
移動前にこれらの情報を確認する必要があるときは、Moveメソッドを使用します。

一部のファイル情報は、VBA関数で取得できます。
そのため3のMoveメソッドを使用する必要が無いケースがあります。
ファイル情報取得については、次のページをご覧ください。
【VBA】ファイル情報(作成日・サイズ・属性等)を取得する方法

 

Nameステートメント

Nameステートメントは、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。
ファイルの名前を変更します。

構文

Name Oldpathname As Newpathname

VBAの一般的な関数呼び出しと異なり、新旧のファイル名の間に "As" を記述します。

  1. Oldpathname: 名前変更前のファイルパス
  2. Newpathname: 名前変更後のファイルのパス

変更前のファイルが存在しないまたは開いている時や、変更後のファイルが存在するときは、エラーが発生します。

使用例

Nameステートメントの使用例です。
ファイルが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。

Sub nameSample()
    Const fileName As String = "C:\Users\xxx\Documents\0201.png"
    Const newFileName As String = "C:\Users\xxx\Documents\0201(move).png"
    
    On Error GoTo ErrorHandler
    Name fileName As newFileName
    MsgBox "名前を変更しました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

エラー処理ルーチンは様々な理由で実行されるので、エラーの特定が煩雑になります。
変更先ファイルが存在する可能性があるときは、Nameステートメントの実行前にDir関数でファイルの存在を確認して、存在するなら上書き確認をします。
その後、ファイルを削除してNameステートメントを実行します。

次のコードは上記の確認処理に加えて、変更前のファイルが存在しているかも確認しています。

    If Dir(fileName, vbNormal) = "" Then
        MsgBox "変更前ファイルが存在しません"
    Else
        If Dir(newFileName, vbNormal) <> "" Then
            If MsgBox("変更先ファイルが存在します。上書きしますか?", vbYesNo) = vbYes Then
                Kill newFileName ' ファイルを削除
                Name fileName As newFileName
                MsgBox "名前を変更しました"
            End If
        End If
    End If

 

MoveFileメソッド

MoveFileメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。

MoveFileメソッドを使用するには、まずは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オブジェクト.MoveFile Source, Destination  
  1. source: 移動元ファイルのパス
  2. destination: 移動先ファイルのパス

移動先ファイルが存在する場合はエラーです。

sourceのファイル名にワイルドカードが含まれる場合は、destinationはフォルダを指定します。
ファイル名にワイルドカードが含まれない時にdestinationがフォルダなら、エラーです。

次の二つのパターンで、指定します。

1.ファイルからファイルへ移動
 例 source: \フォルダ\abc.txt  destination: \フォルダ2\abc2.txt

2.ワイルドカード指定ファイルからフォルダへ移動
 例 source: \フォルダ\ab*.txt   destination: \フォルダ2\

ワイルドカードで他フォルダ内へ移動する場合は、1ファイルずつ処理されます。
そして何らかの原因で処理できないとき、その時点でエラーになります。
従って失敗時でも、一部のファイルが移動している可能性があります。
このケースでは、移動済みのファイルを元に戻す処理が必要です。

移動ではなくて、ファイルコピー成功後に元ファイルを削除することを検討した方がよいかもしれません。

使用例

MoveFileメソッドの使用例です。
次のコードはimageフォルダ内のPNG画像ファイルを、image2フォルダに移動しています。

Sub copyFileSample()
    Const sourceFile As String = "C:\Users\xxx\Documents\image\*.png"
    Const destinationFile As String = "C:\Users\xxx\Documents\image2\"
    
    Dim fso As New Scripting.FileSystemObject

    On Error GoTo ErrorHandler
    
    fso.MoveFile sourceFile, destinationFile,true
    MsgBox "移動しました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

FileSystemObjectを取得している状態でファイルまたはフォルダの存在を確認するときは、FileSystemObjectのFileExistsメソッドまたはFolderExistsメソッドを使用します。

FileSystemObjectオブジェクト.FileExists( FileSpec )
FileSystemObjectオブジェクト.FolderExists( FolderSpec )

いずれのメソッドも対象が存在するときはTrueを、存在しない時は False を返します。

 

Moveメソッド

MoveメソッドはFileオブジェクトのメンバーです。
Fileオブジェクトは、FileSystemObjectオブジェクトのGetFileメソッドで取得します。

Moveメソッドはフォルダの移動もできます。
次のページを参考にしてください。
Moveメソッド|【VBA】フォルダの移動(名前変更)する方法

構文

set Fileオブジェクト = FileSystemObjectオブジェクト.GetFile( FilePath )
Fileオブジェクト.Move Destination
  1. FilePath: 移動元ファイルのパス
  2. destination: 移動先ファイルのパス

移動先ファイルが存在する場合、エラーです。

移動元ファイルのパスはワイルドカード指定できません。

使用例

Moveメソッドの使用例です。
次のコードはファイルの作成日時が2022/5/20以前のとき、別名で移動しています。

Sub moveSample()
    Const sourceFile As String = "C:\Users\xxx\Documents\image\image.png"
    Const destinationFile As String = "C:\Users\xxx\Documents\image\image_old.png"
    
    Dim fso As New Scripting.FileSystemObject
    Dim fo As file
    
    On Error GoTo ErrorHandler

    Set fo = fso.GetFile(sourceFile)
    If fo.DateCreated < #5/20/2022# Then
        fo.Move destinationFile
    End If
    
FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

Moveを実行しても、Fileオブジェクトは移動前のファイル情報を保持します。
移動前のファイルは存在しないため、Move実行後はDeleteやCopyなどのメソッドを使用できません。

更新日:2024/01/18

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。