和風スパゲティのレシピ

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

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

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


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

  • パスのうちフォルダ部分を変えれば移動になる
  • パスのうちファイル名部分を変えれば名称変更になる

という原理になります。


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

基本形

Name 移動するファイルのパス As 移動先のファイルパス

実行例

' 別のフォルダへ移動
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\Book1.xlsx" _
     As "C:\Users\○○\Desktop\テスト2\Book2.xlsx"

解説

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\Book1.xlsx") = "" Then
    Name "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
         As "C:\Users\○○\Desktop\テスト2\Book1.xlsx"
Else
    行先のパスにすでにファイルがあった場合の処理
End If

 
移動時にファイルを上書きしたい場合は、
それを一発でやってくれる機能はありませんので、

  1. 行先のファイルがあればKillステートメントで削除して、
  2. そのあとでNameステートメントで移動する

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

詳細はこちらをご覧ください。

www.limecode.jp


行先のフォルダがない

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

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

エラーとなります。

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


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

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

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

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

エラーとなります。


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

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

Nameステートメントをフォルダに対して使う場合は、
異なるドライブ間の移動ができません。

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


しかし、ファイルに実行するNameステートメントは別ドライブ間の移動が可能です。

ドライブ間の移動を行う際は、この仕様の違いにきをつけてください。

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

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


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

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

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

Dim FSO As New FileSystemObject

' 同名で別フォルダに移動
FSO.MoveFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\" ' ⇐ ここのファイル名を省略可

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

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



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

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

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

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


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

Dim FSO As New FileSystemObject

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

詳細はこちらをどうぞ。
www.limecode.jp