TL;DR —
Name oldPath As newPathはファイルの名前を変更します — しかしnewPathが別の フォルダーを指していれば、VBA はファイルをそこへ移動します。1 つのステートメントが両方の 仕事をこなすのです。そしてFileCopyと違い、Nameは上書きを拒みます。 対象がすでに存在すると、それを置き換える代わりにerror 58を発生させます。
Sub RenameAndMove()
Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx" ' 同じフォルダー → リネーム
Name "C:\Reports\final.xlsx" As "C:\Archive\final.xlsx" ' 別のフォルダー → 移動
End Sub
名前の変更と移動は 2 つの別々の操作に感じられるので、たいていの人は 2 つの別々のコマンドを探しに
行きます。VBA はそれらを 1 つのステートメント — Name — にまとめており、驚きは名前を変えることでは
なく、コピー先のフォルダーが異なったとたん同じステートメントがファイルをそっと移動させることに
あります。そこに、上書きへの頑固な拒否を加えると、Name は VBA のほかのどのディスク道具とも
違う振る舞いをします。その 2 つの特性を覚えれば、予測できるようになります。
この記事で学べること
- 考え方の軸 —
Nameは1 つのステートメントでリネームと移動 Nameがerror 58で上書きを拒む理由 —FileCopyとは正反対Nameがドライブをまたげない理由と、FileCopy+KillあるいはMoveFileがその仕事を どうするか- ほかのエラー — コピー元がない(
53)、ファイルが開いている(70) — とそのガードの仕方 Name old As newの構文の罠、そしてそれが.Nameプロパティの隣で奇妙に読める理由FileSystemObject.MoveFileを選ぶタイミングと、無人マクロのための安全なリネームパターン
考え方の軸:リネームと移動は同じステートメント
鍵となる洞察は、Name がリネーム対移動という概念を気にしないことです — 気にするのは古い
パスと新しいパスだけ。古いパスのディレクトリエントリを取り除き、新しいパスにエントリを作り
ます。フォルダー部分が同じなら、それはあなたにはリネームと読めます。フォルダー部分が異なれば、
ファイルは別の場所に行き着く — 移動です。
Name "C:\In\a.xlsx" As "C:\In\b.xlsx"— 同じフォルダー、新しい名前 → リネームName "C:\In\a.xlsx" As "C:\Out\a.xlsx"— 新しいフォルダー、同じ名前 → 移動Name "C:\In\a.xlsx" As "C:\Out\b.xlsx"— 新しいフォルダーかつ新しい名前 → 移動かつ リネームを一度に
組み込みの VBA に別個の「移動」ステートメントはありません — Name がその移動です。いったん
「パスを変える」ものとして見えれば、以下のあらゆる挙動が導かれます。
Name は上書きを拒む — FileCopy とは正反対
ここが、Name がディスクの道具箱のほかと袂を分かつところです。新しいパスにファイルがすでに
存在すれば、Name はそれを置き換えません — エラーで止まります。
Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx" ' error 58 — "File already exists"
3 つの組み込みと、「コピー先が存在したら?」への矛盾する答えを比べてみましょう。
これは安全機能です。Name は既存のファイルを誤って上書きすることが決してありません。しかしそれは
同時に、対象の名前がすでに使われていた瞬間、無人マクロが停止することも意味します。対象を
置き換えるつもりなら、まずそれを削除しましょう — そしてそれを存在チェックでガードします。
If Dir("C:\Reports\final.xlsx") <> "" Then Kill "C:\Reports\final.xlsx" ' 対象を片づける
Name "C:\Reports\draft.xlsx" As "C:\Reports\final.xlsx" ' これで成功する
その存在テストは、またしてもファイルの存在確認の 1 行版です。
ここではそれが、スケジュールされたリネームを error 58 で止めないためのものです。
Name はドライブをまたげない — FileCopy + Kill または MoveFile を使う
Name はディレクトリエントリを書き換えることでドライブ内のファイルを移動します。速くて
安上がりです。ファイルを別のドライブへ移動することはできません。それにはバイトを物理的に
コピーする必要があるからです。
Name "C:\Reports\March.xlsx" As "D:\Archive\March.xlsx" ' error 74 — "Can't rename with different drive"
ドライブをまたぐ移動は、コピーに削除を足したもの — まさにコピーファイルのガイド の等式です。
FileCopy "C:\Reports\March.xlsx", "D:\Archive\March.xlsx" ' バイト列を別ドライブへコピー
Kill "C:\Reports\March.xlsx" ' それから元を削除
Kill はコピーが着地したことを確認したあとにだけ行いましょう — その削除は
永久です。あるいは、FileSystemObject に
MoveFile で両方を 1 回の呼び出しでやらせましょう。こちらはドライブをまたぐ移動を内部で処理します
(後述)。
ほかのエラー:コピー元がない、ファイルが開いている
あと 2 つの実行時エラーが Name を締めくくり、どちらもほかのファイルステートメントと同じ直し方を
します。
Name "C:\Reports\missing.xlsx" As "C:\Reports\x.xlsx" ' error 53 — コピー元が見つからない
Name "C:\Reports\open.xlsx" As "C:\Reports\x.xlsx" ' error 70 — ファイルが開いている/ロック中
error 53— コピー元が存在しない。リネーム前にIf Dir(oldPath) <> "" Thenでガードする。error 70— ファイル(またはその対象)が開いている。Excel で開いているブックはリネーム できません。まずCloseしてから、ディスク上のファイルをリネーム しましょう。
だから堅牢なリネームは3 つをガードします。コピー元が存在する、対象が存在しない(または たった今削除された)、そしてファイルが開いていない。リネームに必要そうに見えるより多くの用心ですが、 それこそが、ダイアログの出ない実行時エラーで無人マクロが止まるのを防ぐものです。
構文の罠:Name(old, new) ではなく Name old As new
Name は関数ではなくステートメントで、その構文は独特です — 2 つのパスがキーワード As で
つながれ、括弧もカンマもありません。
Name oldPath As newPath ' 正しい — As キーワードを使うステートメント形式
Name(oldPath, newPath) ' 誤り — Name はこう動かない。コンパイル/構文エラー
これはまた、混乱を招く読み方をします。VBA はすでにオブジェクトモデルのそこかしこで .Name を
プロパティとして使っているからです(ws.Name、wb.Name)。ファイルをリネームする Name は
トップレベルのステートメントで、それらのプロパティとは無関係です。Name x As y が単独の行に
あるのが、それがプロパティの読み取りではなくファイル操作だという目印です。
FileSystemObject.MoveFile と安全なリネームパターン
オブジェクトモデルの代替は MoveFile で、移動にはしばしばこちらがより快適な選択です。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' 遅延バインディング — どのマシンでも動く
fso.MoveFile "C:\Reports\March.xlsx", "D:\Archive\" ' 別ドライブも処理。末尾の \ はフォルダーの中へ
MoveFile は手動のコピーしてから削除なしにドライブをまたいで移動し、ワイルドカードを受け付け、
フォルダー形式のコピー先(末尾の \)を取ります。Name と同じく上書きを拒むので、コピー先は
まず片づいていなければなりません。純粋なその場でのリネームには、専用の FSO メソッドはありません。
Name がなお最短の道具です。あるいは、同じフォルダー内でフルパスの新しいパスを指定した MoveFile。
まとめると、無人マクロを止めない安全なリネームはこうなります。
Dim src As String, dst As String
src = "C:\Reports\draft.xlsx": dst = "C:\Reports\final.xlsx"
If Dir(src) = "" Then Exit Sub ' リネームするものがない
If Dir(dst) <> "" Then Kill dst ' Name が error 58 にならないよう対象を片づける
Name src As dst ' 同一ドライブのリネームまたは移動
正直な結論:同一ドライブは Name、ドライブをまたぐならコピーして削除
Name はリネームと、ドライブ内での移動に対する 1 行の答えです — その 2 つの決定的な特性を尊重する
限りにおいて。4 つのルール。
- リネームまたは同一ドライブ移動 →
Name old As new— 1 つのステートメントで仕事のすべて。 - 上書きを拒む → まず対象を片づける(存在チェックのあとに
Kill)。さもないとerror 58で 止まる。 - ドライブをまたぐ移動 →
Nameにはできない。FileCopy+Kill、またはfso.MoveFileを使う。 - コピー元、対象、開いている状態をガードする → スケジュールされたリネームが
error 53、58、70、74で止まらないように。
error 74 を見た瞬間、Name にドライブをまたがせようとするのをやめましょう — それは、ボリューム
をまたぐ移動はコピーだと Windows が告げているのであり、道具はそれに応じて変わります。
ExcelMaster の活用
ファイルを安全にリネームするとは、Name が移動もすること、上書きを拒むこと、ドライブを
またげないこと、そしてコピー元がない、またはファイルが開いていると止まることを覚えておくこと —
ただリネームするだけに見えるステートメントを取り巻く、4 つの別々の罠です。
ExcelMaster は、止まらない
リネームを書きます。ジョブを説明すれば — 「各エクスポートに今日の日付を付けてリネームして」、
あるいは「完了したファイルをアーカイブドライブへ移動して」 — 正しいステートメントを生成します。
同一ドライブのリネームや移動には対象を片づけるガード付きの Name、コピー先が別ドライブにあるときは
FileCopy + Kill または fso.MoveFile、そして
error 58 や 74 が無人の実行を決して止めないような存在チェック。あなたは結果を説明するだけ。
リネーム、移動、コピーして削除の間を選ぶのは、それがやります。
よくある質問
VBA でファイルの名前を変更するには?
As キーワードとともに Name ステートメントを使います:Name "C:\In\old.xlsx" As "C:\In\new.xlsx"。
両方のパスが同じフォルダーにあれば、その場でファイルの名前を変更します。まずガードしましょう —
Name はコピー元がないと error 53 を、新しい名前のファイルがすでにあると error 58 を発生させる
ので、コピー元が存在することを確認し、(存在テストのあとに Kill で)対象を片づけてからリネーム
します。
VBA の Name ステートメントはファイルの移動もしますか?
はい。Name はファイルのパスを変えるので、新しいパスが別のフォルダーにあれば、VBA はファイルを
そこへ移動します — Name "C:\In\a.xlsx" As "C:\Out\a.xlsx" は a.xlsx を In から Out へ移動
します。組み込みの VBA に別個の移動ステートメントはありません。両方のフォルダーが同じドライブに
ある限り、Name が移動です。ドライブをまたぐ移動には、FileCopy + Kill、または fso.MoveFile を
使いましょう。
VBA の Name が error 58 File already exists になるのはなぜですか?
新しい名前のファイルがすでに存在し、Name が上書きを拒むからです — 無言で上書きする
FileCopy とは正反対です。これは安全機能ですが、無人マクロを止めます。対象を置き換えるには、まず
それを削除しましょう:If Dir(newPath) <> "" Then Kill newPath、それから Name oldPath As newPath。
Kill する前に、本当に既存のファイルを捨てるつもりなのかを必ず確認してください。
VBA でファイルを別のドライブへ移動するには?
Name はドライブをまたげません — Name "C:\a.xlsx" As "D:\a.xlsx" は error 74「Can't rename with
different drive」を発生させます。ドライブをまたぐ移動は、コピーに削除を足したものです:
FileCopy "C:\a.xlsx", "D:\a.xlsx" してから Kill "C:\a.xlsx"(コピーの成功を確認したあとにだけ)。
あるいは、FileSystemObject の fso.MoveFile が、ドライブをまたぐ移動を 1 回の呼び出しで行います。
Name ステートメントと Name プロパティの違いは何ですか?
無関係です。Name ステートメントは、ディスク上のファイルの名前を変更または移動します —
Name oldPath As newPath、As キーワードを使うトップレベルのステートメントです。.Name
プロパティは、Excel モデルのオブジェクトの名前を読み書きします。ワークシートの ws.Name や
ブックの wb.Name などです。Name x As y が単独の行にあれば、それはファイル操作です。
something.Name はプロパティです。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-22。
関連ガイド: VBA Copy File · VBA Delete File · VBA Check If File Exists · VBA Dir · VBA FileSystemObject
