目次
はじめに
ファイルの整理やリネーム作業をVBAで自動化していると、「AというファイルとBというファイルの名前を、そっくりそのまま入れ替えたい」という特殊なケースに遭遇することがあります。例えば、連番の画像ファイルの名前を一つずらしたり、特定の2つのファイルだけを交換したりする場面です。
VBAの FileSystemObject (FSO) を使えば、このようなファイル名の交換処理もプログラムで実現可能です。
この記事では、FSOの Name
プロパティを利用して、2つのファイル名を安全に入れ替える具体的な方法を、コードの解説付きで丁寧にご紹介します。
ファイル名を入れ替えるVBAサンプルコード
ファイル名を入れ替えるには、一時的な「仮のファイル名」を使うのが定石です。AとBのジュースをコップごと交換したいときに、一度片方を空のコップに移すのと同じ原理です。
処理の流れ
- ファイルAの名前を、他と重複しない「仮のファイル名」に変更する。
- ファイルBの名前を、元々のファイルAの名前に変更する。
- 「仮のファイル名」にしたファイルの名前を、元々のファイルBの名前に変更する。
ここでは、Excelファイルと同じ階層にある「資料_A.xlsx」と「資料_B.xlsx」の名前を入れ替えるコードを作成します。
完成コード
Sub SwapFileNames()
'== 変数を定義します ==
Dim objFSO As Object
Dim fileAPath As String, fileBPath As String
Dim originalNameA As String, originalNameB As String
Dim tempName As String
'== FileSystemObjectを生成します ==
Set objFSO = CreateObject("Scripting.FileSystemObject")
'== ファイルパスを設定します ==
fileAPath = ThisWorkbook.Path & "¥資料_A.xlsx"
fileBPath = ThisWorkbook.Path & "¥資料_B.xlsx"
'== ファイルの存在を確認します ==
If Not objFSO.FileExists(fileAPath) Or Not objFSO.FileExists(fileBPath) Then
MsgBox "対象のファイルが見つかりません。ファイル名を確認してください。", vbExclamation
Exit Sub
End If
'== 元のファイル名と、一時的なファイル名を準備します ==
originalNameA = objFSO.GetFile(fileAPath).Name
originalNameB = objFSO.GetFile(fileBPath).Name
tempName = "temp_" & Format(Now, "yyyymmdd_hhmmss") & ".tmp" '重複しないユニークな名前を生成
'== ファイル名を入れ替えます ==
On Error GoTo ErrorHandler 'エラー処理
' 1. ファイルA → 仮の名前
objFSO.GetFile(fileAPath).Name = tempName
' 2. ファイルB → 元のAの名前
objFSO.GetFile(fileBPath).Name = originalNameA
' 3. 仮の名前 → 元のBの名前
objFSO.GetFile(ThisWorkbook.Path & "¥" & tempName).Name = originalNameB
MsgBox "ファイル名の入れ替えが完了しました。", vbInformation
'== オブジェクトを解放して終了します ==
Set objFSO = Nothing
Exit Sub
'== エラー処理ルーチン ==
ErrorHandler:
MsgBox "ファイル名の変更中にエラーが発生しました。" & vbCrLf & Err.Description, vbCritical
' ここにエラー発生時の名前を元に戻す処理などを追加することも可能
Set objFSO = Nothing
End Sub
コードの解説
If Not objFSO.FileExists(...) Then ...
処理を始める前に、名前を入れ替えたい2つのファイルが実際に存在するかをFileExists
メソッドで確認しています。これにより、「ファイルが見つかりません」という実行時エラーを防ぎます。originalNameA = objFSO.GetFile(fileAPath).Name
GetFile
メソッドでファイルオブジェクトを取得し、その.Name
プロパティを使ってファイル名(この例では “資料_A.xlsx”)を取得・保存しています。tempName = "temp_" & Format(Now, "yyyymmdd_hhmmss") & ".tmp"
名前の入れ替えに使う、一時的なファイル名を生成しています。他のファイルと名前が衝突しないように、Format(Now, ...)
を使って現在の日時(秒単位まで)を含めたユニークな名前を作成しています。On Error GoTo ErrorHandler
ファイル名の変更は、アクセス権の問題などで失敗する可能性があります。この一文を入れておくことで、もし処理の途中でエラーが発生した場合に、ErrorHandler:
以降のコードにジャンプさせ、プログラムが強制終了するのを防ぎます。- 名前の入れ替え処理(3ステップ) コメントに記載の通り、①ファイルAを仮の名前に変更し、②空いたファイルAの名前にファイルBをリネームし、③最後に仮のファイル名をファイルBの名前に変更する、という手順で入れ替えを実現しています。
まとめ
今回は、VBAのFSOを使って2つのファイル名を安全に入れ替える方法について解説しました。
- ファイル名の変更は
File.Name
プロパティで行う。 - 2つのファイル名を入れ替えるには、一時的なファイル名を利用する。
- 処理の前に
FileExists
でファイルの存在を確認する。 - エラーハンドリングを組み込み、不測の事態に備える。
一見複雑に見えますが、この「一時的な退避場所を使う」という考え方は、プログラミングにおける値の交換(スワップ)の基本です。ぜひこの機会に覚えて、日々の業務自動化にご活用ください。