フォルダを移動したりフォルダ名を変更する際に使用する、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ステートメントにはこの処理はできませんので、
もしこの処理を行いたい場合はこちらをご覧ください。
行先のフォルダがない
移動先のフォルダが存在しない場合は、
実行時エラー53「ファイルが見つかりません。」 |
エラーとなります。
フォルダが必要な場合は先に作成してから実行してください。
微妙にズレてるエラーメッセージなのも注意が必要ですね。
移動するフォルダの中にあるファイルを開いている
移動するフォルダ内のいずれかのファイルを開いていると、
実行時エラー75「パス名が無効です。」 |
エラーとなります。
これがエラーになるのは当たり前と言えば当たり前なのですが、
エラーメッセージがわかりにくいため混乱しないよう気を付けてください。
別のドライブに移動する
CドライブからDドライブへ移動しようとしたり、
ローカルフォルダからファイル共有サーバーへ移動をすると、
実行時エラー75「パス名が無効です。」 |
エラーとなります。
これを一発で実現する方法はありませんので、
- まずはフォルダごとコピー
- そのあと元のフォルダを削除
という手順で実行する必要があります。
この処理には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メソッドの方を使ってみてください。
詳細はこちらをどうぞ。