和風スパゲティのレシピ

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

フォルダを移動・名称変更する-Nameステートメント

フォルダを移動したりフォルダ名を変更する際に使用する、Nameステートメントの使い方を解説します。


正確には「フォルダパスを変更するステートメント」だと思ってください。

  • パスのうち最後のフォルダ名(最後の\より左)を変えれば名称変更になる
  • パスのうち途中のフォルダパス(最後の\より右)を変えれば移動になる

という原理になります。


また、目的が変わるためページを分けましたが、
Nameステートメントは「ファイルの移動/名称変更」も実行できます。
www.limecode.jp

基本形

Name 移動するフォルダのパス As 移動先のフォルダパス

実行例

' 別のフォルダ内へ移動
Name "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
     As "C:\Users\○○\Desktop\親フォルダ2\対象フォルダ"

' 名前の変更
Name "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
     As "C:\Users\○○\Desktop\親フォルダ1\新フォルダ名"

' 移動+名前を変更
Name "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
     As "C:\Users\○○\Desktop\親フォルダ2\新フォルダ名"

解説

Nameステートメントはフォルダパスを変更するステートメントです。


実行例の通り、

  • パスのうち最後のフォルダ名(最後の\より左)を変えれば名称変更になる
  • パスのうち途中のフォルダパス(最後の\より右)を変えれば移動になる
  • どちらも変えることで移動と名称変更を同時に実行できる

という動きをします。


「As」を利用する珍しいステートメントですのでご注意ください。
「=」や「,」では動きません。


また、Nameステートメントはファイルの移動や名称変更も実行できます。

ファイル・フォルダの移動と名称変更という4つのパターン同じ記述でこなすため、
一見万能に思えますが実際はかなり読みづらいステートメントです。

' ↓全部同じに見えるが全く違う処理をしている
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"

 
「コメントの記載」と「アンダースコア_を使用したコードの改行」を駆使して、
なるべく読みやすくなるように心掛けて使いましょう。

' ファイルの移動
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"

 

発生するエラー

移動先に既にフォルダがある場合

Nameステートメントは処理的には「移動」ではなく「パスの変更」であるため、
移動先パスに既にフォルダがある場合はエラーとなります。


移動先のフォルダが既に存在するかどうかは、
Dir関数などで判定を行ってください。

If Dir("C:\Users\○○\Desktop\親フォルダ2\対象フォルダ", vbDirectory) = "" Then
    Name "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
         As "C:\Users\○○\Desktop\親フォルダ2\対象フォルダ"
Else
    行先のパスにすでにフォルダがあった場合の処理
End If

 


手作業において「同名のフォルダを同じ親フォルダ内に移動」した場合は、

フォルダの統合

こんな表示が出て、同名ファイルを上書き/スキップしてフォルダを統合できます。


しかしNameステートメントにはこの処理はできませんので、
もしこの処理を行いたい場合はこちらをご覧ください。

www.limecode.jp

行先のフォルダがない

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

実行時エラー53「ファイルが見つかりません。」

エラーとなります。

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


微妙にズレてるエラーメッセージなのも注意が必要ですね。

移動するフォルダの中にあるファイルを開いている

移動するフォルダ内のいずれかのファイルを開いていると、

実行時エラー75「パス名が無効です。」

エラーとなります。


これがエラーになるのは当たり前と言えば当たり前なのですが、
エラーメッセージがわかりにくいため混乱しないよう気を付けてください。

別のドライブに移動する

CドライブからDドライブへ移動しようとしたり、
ローカルフォルダからファイル共有サーバーへ移動をすると、

実行時エラー75「パス名が無効です。」

エラーとなります。


これを一発で実現する方法はありませんので、

  1. まずはフォルダごとコピー
  2. そのあと元のフォルダを削除

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


この処理にはFileSystemObjectが必要になりますので、
詳しくはこちらの記事をご覧ください。
www.limecode.jp

上位互換:FileSystemObject.MoveFolderメソッド

FileSystemObject(以下FSO)にもフォルダを移動できるメソッドがあり、
「MoveFolderメソッド」が該当します。


このMoveFolderメソッドにはNameステートメントにはできない、

  • 親フォルダパスだけを指定して同フォルダ名のまま移動する
  • ワイルドカート*を使って複数のファイルを一括で移動する

この2つの機能を有しています。

Dim FSO As New FileSystemObject

' 同名で別フォルダに移動
FSO.MoveFolder "C:\Users\○○\Desktop\親フォルダ1\対象フォルダ" _
                      , "C:\Users\○○\Desktop\親フォルダ2\" ' ⇐ ここのフォルダ名を省略可

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

特に後者の一括移動はかなり便利な機能ですね。



また、Nameには「4つの処理が同じ記述になってしまう」欠点がありましたが、
FSOにはNameプロパティとMoveFile/MoveFolderメソッドがそれぞれあるため、

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

このようにはっきりと処理内容が読み分けられるようになります。

これならコメントが不要ですね。


このようにFSOは機能性・可読性とも優れており、両者を比較すると、
これ↓を書く必要がある以外は完全上位互換と言っていいです。

Dim FSO As New FileSystemObject

 
ファイル・フォルダ操作をよく行う方は、
FSO.MoveFolderメソッドの方を使ってみてください。

詳細はこちらをどうぞ。

www.limecode.jp