和風スパゲティのレシピ

日本語でコーディングするExcelVBA

FileSystemObject.MoveFileメソッド

FileSystemObject(以下FSO)にてファイルを移動する、
MoveFileメソッドについて解説します。

基本形

FSO.MoveFile 移動するファイルのパス, 移動先ファイル/フォルダパス

実行例

Dim FSO As New FileSystemObject

' 同名で別フォルダへ移動
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

' 移動と同時にリネーム
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\Book2.xlsx"

' すべてのxlsxファイルを移動
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

※ 変数FSOの宣言部についてはこちらをご覧ください。
FileSystemObjectの参照設定と変数宣言について

解説

FileSystemObjectのMoveFileメソッドは、
移動元・行先の2つのパスを受け取ってファイルを移動します。


移動先のパスにはファイルパス・フォルダパスをどちらも指定でき、

  • ファイルパスの場合はファイル名の変更も同時に行える
  • フォルダパスの場合は同名のまま移動される

という動きになります。どちらも便利な仕様ですね。


注意点としてフォルダパスを渡す場合は最後の\を忘れないようにしてください。

↓の書き方では「テスト2という名前に変更」という意味になってエラーになります。

FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2" ' ⇐ ここに最後の\を書かないとエラー

 

また、MoveFileメソッドは以下のワイルドカードを使用でき、
該当するすべてのファイルを一括移動することができます。

* 任意の文字列(0文字も含む)
? 任意の1文字


非常に便利な機能ですので覚えておきましょう。


なお、このワイルドカード使用による一括移動時は、
行先パスはすべてフォルダパスとして扱われます。


これにより\のあるなしでエラーがでることがなくなり、
以下のどちらのコードも「同名で別フォルダに一括コピー」として動きます。

FSO.MoveFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

FSO.MoveFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2" ' ⇐ *使用時は最後の\がなくても動く

 
ただ、下の書き方をしたコードは流用がしにくい(*を消せない)ため、
なるべく上の書き方で書くことをおすすめします。

移動先のファイルを上書きしたい場合

似たメソッドの「CopyFile」には第3引数「OverWriteFiles」があるのですが、
MoveFileメソッドには「既存ファイルを上書きして移動する」機能はありません。


これを実行したい場合は、

  • 行先のファイルがあればDeleteFileで削除して、
  • そのあとでMoveFileで移動する

という手順で行う必要があります。


詳細はこちらをご覧ください。
www.limecode.jp

名前を変更する場合

MoveFileメソッドは名前の変更にも利用できます。

' ファイル名を変更
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト1\Book2.xlsx"

このように「フォルダパスが同じファイルパスを2つ渡す」ことで、
名前のみを変更することが可能です。


しかしMoveと言っているのに移動しないのはいらぬ誤解を招く恐れがあります。


名前を変更する場合は、素直に「FileオブジェクトのNameプロパティ」を使い、

Dim ファイル As File
Set ファイル = FSO.GetFile("C:\Users\○○\Desktop\テスト1\Book1.xlsx")

ファイル.Name = "Book2.xlsx"

このように書いた方が意図も伝わりやすく、
オブジェクトを扱うFSOらしいコードになるのでおすすめです。

その他の注意点・エラー

移動するファイルを開いている

移動するファイルを開いていると、

実行時エラー70「書き込みできません。」

エラーとなります。

行先のフォルダがない

移動先のフォルダが存在しない場合は、

実行時エラー76「パスが見つかりません。」

エラーとなります。

フォルダが必要な場合は先に作成してから実行してください。

移動先に既にファイルがある

前述の通りMoveFileメソッドは上書き移動ができませんので、
移動先にファイルがあった場合は

実行時エラー58「すでに同名のファイルが存在しています。」

エラーとなります。


移動先のファイルが既に存在するかどうかは、
FileExistsメソッドなどで判定を行ってください。

If FSO.FileExists("C:\Users\○○\Desktop\テスト2\Book1.xlsx") = False Then
    FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                        "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
Else
    行先のパスにすでにファイルがあった場合の処理
End If

 
なお、複数ファイルを一括移動するワイルドカード使用時は、
同名のファイルが見つかったところでエラーとなりますので、
それまでのファイルは移動し終わった後で止まります。

一括とは言いますが、内部では1ファイルずつ処理されているということですね。

別のドライブへの移動は可能

兄弟メソッドにあたる「フォルダの移動:MoveFolderメソッド」は、
異なるドライブ間の移動ができません。

CドライブからDドライブだったり、
ローカルから共有サーバーへの移動はできないということです。


しかし、本記事のMoveFileは別ドライブ間の移動が可能です。

MoveFolderの仕様をご存じの方は、混同しないよう気を付けてください。