和風スパゲティのレシピ

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

NameとFSO.MoveFolderの違い

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

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

同じところ

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


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

Name "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
     As "C:\Users\○○\Desktop\親フォルダ2\対象フォルダ" 
' ↕ 同じ処理
FSO.MoveFolder "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
                      , "C:\Users\○○\Desktop\親フォルダ2\対象フォルダ" 

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

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


加えて「CドライブからDドライブ」や「ローカルから共有サーバー」など、
ドライブ間移動ができない点も同じです。

違うところ

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

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

' 「売上データ○○」フォルダをすべて移動
FSO.MoveFolder "C:\Users\○○\Desktop\親フォルダ1\売上データ*" _
                      , "C:\Users\○○\Desktop\親フォルダ2\"

最後のフォルダ名を省略でき、その場合は同名で移動

FSO.MoveFolder "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
                      , "C:\Users\○○\Desktop\親フォルダ2\" ' ⇐ ここにフォルダ名を書かなくてもよい

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

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

例えば、

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

という違いが出ます。



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

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

使い分け

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


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

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

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


さらに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」と「MoveFolder」ですからね。
フォルダを移動しているのがわかるのはどう見ても後者です。


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

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

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

移動時の上書きや別ドライブへの移動

今回「同じところ」に書いた通り、

  • 移動先のフォルダ・ファイルを上書きできない
  • 別のドライブに移動ができない

という欠点を両者ともが持っています。

これに対応したい場合は以下の記事を参考ください。
www.limecode.jp
www.limecode.jp