【VBA】FSOで2つのファイル名を入れ替える方法|Nameプロパティ活用術

目次

はじめに

ファイルの整理やリネーム作業をVBAで自動化していると、「AというファイルとBというファイルの名前を、そっくりそのまま入れ替えたい」という特殊なケースに遭遇することがあります。例えば、連番の画像ファイルの名前を一つずらしたり、特定の2つのファイルだけを交換したりする場面です。

VBAの FileSystemObject (FSO) を使えば、このようなファイル名の交換処理もプログラムで実現可能です。

この記事では、FSOの Name プロパティを利用して、2つのファイル名を安全に入れ替える具体的な方法を、コードの解説付きで丁寧にご紹介します。


ファイル名を入れ替えるVBAサンプルコード

ファイル名を入れ替えるには、一時的な「仮のファイル名」を使うのが定石です。AとBのジュースをコップごと交換したいときに、一度片方を空のコップに移すのと同じ原理です。

処理の流れ

  1. ファイルAの名前を、他と重複しない「仮のファイル名」に変更する。
  2. ファイルBの名前を、元々のファイルAの名前に変更する。
  3. 「仮のファイル名」にしたファイルの名前を、元々のファイル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

コードの解説

  1. If Not objFSO.FileExists(...) Then ... 処理を始める前に、名前を入れ替えたい2つのファイルが実際に存在するかを FileExists メソッドで確認しています。これにより、「ファイルが見つかりません」という実行時エラーを防ぎます。
  2. originalNameA = objFSO.GetFile(fileAPath).Name GetFile メソッドでファイルオブジェクトを取得し、その .Name プロパティを使ってファイル名(この例では “資料_A.xlsx”)を取得・保存しています。
  3. tempName = "temp_" & Format(Now, "yyyymmdd_hhmmss") & ".tmp" 名前の入れ替えに使う、一時的なファイル名を生成しています。他のファイルと名前が衝突しないように、Format(Now, ...) を使って現在の日時(秒単位まで)を含めたユニークな名前を作成しています。
  4. On Error GoTo ErrorHandler ファイル名の変更は、アクセス権の問題などで失敗する可能性があります。この一文を入れておくことで、もし処理の途中でエラーが発生した場合に、ErrorHandler: 以降のコードにジャンプさせ、プログラムが強制終了するのを防ぎます。
  5. 名前の入れ替え処理(3ステップ) コメントに記載の通り、①ファイルAを仮の名前に変更し、②空いたファイルAの名前にファイルBをリネームし、③最後に仮のファイル名をファイルBの名前に変更する、という手順で入れ替えを実現しています。

まとめ

今回は、VBAのFSOを使って2つのファイル名を安全に入れ替える方法について解説しました。

  • ファイル名の変更は File.Name プロパティで行う。
  • 2つのファイル名を入れ替えるには、一時的なファイル名を利用する。
  • 処理の前に FileExists でファイルの存在を確認する。
  • エラーハンドリングを組み込み、不測の事態に備える。

一見複雑に見えますが、この「一時的な退避場所を使う」という考え方は、プログラミングにおける値の交換(スワップ)の基本です。ぜひこの機会に覚えて、日々の業務自動化にご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次