ファイルを移動したりファイル名を変更する際に使用する、
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
移動時にファイルを上書きしたい場合は、
それを一発でやってくれる機能はありませんので、
- 行先のファイルがあればKillステートメントで削除して、
- そのあとでNameステートメントで移動する
という手順で行う必要があります。
詳細はこちらをご覧ください。
行先のフォルダがない
移動先のフォルダが存在しない場合は、
実行時エラー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