和風スパゲティのレシピ

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

NameとFSO.MoveFileの違い

ファイルを移動する際に使用する、
NameステートメントとFileSystemObject.MoveFileメソッドの違いを解説します。

※ FileSystemObjectは以下FSOと略記します。

同じところ

どちらも移動元・行先の2つのパスを受け取って、
その指示通りにファイルを移動します。


以下のように同じ引数を渡せば、まったく同じ動きをします。

Name "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
     As "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
' ↕ 同じ処理
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\Book1.xlsx"

 
また移動先に既にファイルがある場合の挙動も同じで、どちらもエラーとなります。

上書きして移動する機能はどちらにもありません。

違うところ

FSOのMoveFileメソッドの方が上位互換で、
Nameステートメントにはない以下の機能を有します。

ワイルドカード*と?が使用可能

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

ファイル名を省略でき、その場合は同名で移動

FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\" ' ⇐ ここにファイル名を書かなくてもよい

環境依存文字の対応範囲が広い

これはFSO全体の話になりますが、
FSOはUnicode(UTF-16)に対応しています。

例えば、

  • ①~⑳のフォルダはNameステートメントで移動可能
  • ㉑~㊿のフォルダはFSO.MoveFileメソッドでないとダメ

という違いが出ます。



反対に、NameにできてFSO.MoveFileメソッドにできないことはありません。

変数宣言の手間があるという点を除けば上位互換と言っていいですね。

使い分け

常にFSO.MoveFileメソッドを使った方が良いです。


まずは上記の「違うところ」に該当する、

  • 同名で別フォルダに移動する場合
  • 複数のファイルを一括で移動する場合

この2つに該当する場合は、当然FSO.MoveFileを使用した方がよいです。


さらにNameステートメントには一つ厄介な特徴があり、
「ファイルの移動」「フォルダの移動」「ファイル名の変更」「フォルダ名の変更」
を同じ記述で実行ができます。

4つの機能を有して万能というと聞こえはいいのですが、裏を返すと
Nameがなんの処理をしているかは引数をよく読まないとわからない
という弊害を生みます。

' ↓全部同じに見えるが全く違う処理をしている
Name "C:\Users\○○\Desktop\テスト1\Book1.xlsx" As "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
Name "C:\Users\○○\Desktop\テスト1\Book1.xlsx" As "C:\Users\○○\Desktop\テスト1\Book2.xlsx"
Name "C:\Users\○○\Desktop\テスト1\サブフォルダ1" As "C:\Users\○○\Desktop\テスト2\サブフォルダ1"
Name "C:\Users\○○\Desktop\テスト1\サブフォルダ1" As "C:\Users\○○\Desktop\テスト1\サブフォルダ2"


これに対し、FSOは各役割が明確なため、

FSO.MoveFile 元パス, 行先パス
FSO.MoveFolder 元パス, 行先パス
ファイル.Name = 新しい名前
フォルダ.Name = 新しい名前

こんな風に4つの処理がプロパティを和訳するだけで分かるようになります。


まあそもそも「Name」と「MoveFile」ですからね。
ファイルを移動しているのがわかるのはどう見ても後者です。


ファイル操作は複雑な処理になりやすく、
しかも使用する「パス」は視覚的にかなり読みづらい文字列です。

FSOの可読性は強い味方になってくれますので、
準備が多少面倒でもFSOをなるべく使っていきましょう。

それぞれの詳細についてはこちらをご覧ください。
www.limecode.jp
www.limecode.jp


移動時に行先の既存ファイルを上書きしたい場合

今回「同じところ」に書いた通り、
移動先に既にファイルがある場合はどちらもエラーになります。


一発で実行する機能はありませんので、これを実現したい場合は、

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

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


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