wanna.jp VBAリファレンス
Top > VBA関数リファレンス > 経理の定型業務を自動化!VBA Nameステートメントでファイルをスマートに移動(アーカイブ)する方法

経理の定型業務を自動化!VBA Nameステートメントでファイルをスマートに移動(アーカイブ)する方法

経理担当者の皆様、日々の業務で大量のデータファイルを扱っていらっしゃるかと思います。
売上データ、仕訳データ、請求書など、処理が終わったファイルを「処理済み」フォルダへ移動させる作業は、地味ながらも非常に重要です。手作業では手間がかかるだけでなく、誤ってファイルを移動し忘れたり、二重処理の原因になったりするリスクも伴います。

そんなファイル整理の悩みをVBAの Name ステートメント が解決します!この記事では、VBAを使ってファイルを安全かつ効率的に移動(アーカイブ)する方法を、具体的なコードを交えてご紹介します。

コピペで動く!基本のファイル移動コード

まずは、VBAでファイルを移動させる最も基本的なコードです。ここでは、カレントディレクトリにある Old.csv というファイルを、同じディレクトリ内の Done フォルダへ移動させる例を示します。

Sub ArchiveProcessedFile()
    ' 移動元のファイルパス
    Dim sourceFilePath As String
    sourceFilePath = "Old.csv" ' 例: カレントディレクトリにあるOld.csv

    ' 移動先のフォルダパス
    Dim destinationFolderPath As String
    destinationFolderPath = "Done\" ' 例: カレントディレクトリのDoneフォルダ

    ' 移動先のファイルパスを構築
    Dim destinationFilePath As String
    destinationFilePath = destinationFolderPath & sourceFilePath

    ' --- ここからがファイル移動の核心部分 ---
    ' Nameステートメントを使ってファイルを移動(または名前変更)
    Name sourceFilePath As destinationFilePath

    MsgBox sourceFilePath & " を " & destinationFolderPath & " へ移動しました。", vbInformation
End Sub

このコードを実行すると、Old.csvDone\Old.csv として移動します。非常にシンプルですね!

要注意!「File already exists」エラーとその回避策

しかし、このシンプルなコードには大きな落とし穴があります。それは、移動先の Done フォルダに、すでに Old.csv という同名のファイルが存在する場合です。

このエラーを回避し、堅牢なファイル移動処理を実現するためには、移動先に同名ファイルが存在するかどうかを事前にチェックし、適切な処理を行う必要があります。

【解決策】ファイルの存在チェックと上書き処理

VBAの Dir 関数を使ってファイルの存在を確認し、もしファイルが存在した場合は、ユーザーに上書きするかどうかを尋ねるのが最も安全な方法です。上書きを許可する場合は、既存のファイルを Kill ステートメントで削除してから Name で移動します。

Sub ArchiveProcessedFileRobust()
    ' 移動元のファイルパス
    Dim sourceFilePath As String
    sourceFilePath = "Old.csv" ' 例: カレントディレクトリにあるOld.csv

    ' 移動先のフォルダパス
    Dim destinationFolderPath As String
    destinationFolderPath = "Done\" ' 例: カレントディレクトリのDoneフォルダ

    ' 移動先のファイルパスを構築
    Dim destinationFilePath As String
    destinationFilePath = destinationFolderPath & sourceFilePath

    ' --- フォルダが存在しない場合は作成する(オプション) ---
    ' これにより、初めてDoneフォルダを作成する場合も安心
    If Dir(destinationFolderPath, vbDirectory) = "" Then
        MkDir destinationFolderPath
    End If

    ' --- 移動先に同名ファイルが存在するかチェック ---
    If Dir(destinationFilePath) <> "" Then
        ' ファイルが存在する場合、ユーザーに上書き確認
        Dim response As VbMsgBoxResult
        response = MsgBox("移動先(" & destinationFilePath & ")に同名のファイルが存在します。" & vbCrLf & _
                          "上書きしますか?", vbYesNo + vbExclamation, "ファイルの上書き確認")

        If response = vbYes Then
            ' はい、を選択した場合、既存のファイルを削除
            Kill destinationFilePath
            MsgBox "既存のファイルを削除しました。移動を続行します。", vbInformation
        Else
            ' いいえ、を選択した場合、処理を中断
            MsgBox "ファイルの移動を中止しました。", vbInformation
            Exit Sub ' サブプロシージャを終了
        End If
    End If

    ' --- エラーハンドリングを追加して、万が一に備える ---
    On Error GoTo ErrorHandler

    ' ファイルの移動を実行
    Name sourceFilePath As destinationFilePath

    MsgBox sourceFilePath & " を " & destinationFilePath & " へ移動しました。", vbInformation
    Exit Sub ' 正常終了時はエラーハンドラをスキップ

ErrorHandler:
    ' エラーが発生した場合の処理
    MsgBox "ファイルの移動中にエラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
End Sub

この改良版コードでは、以下の点が強化されています。

  • MkDir で移動先フォルダが存在しない場合に自動作成します。
  • Dir 関数で移動先の同名ファイルを事前に検知します。
  • MsgBox でユーザーに上書きの確認を促し、意図しないデータ削除を防ぎます。
  • Kill ステートメントで、上書き同意があった場合にのみ既存ファイルを削除します。
  • On Error GoTo ErrorHandler で、予期せぬエラーが発生してもVBAが停止せず、メッセージを表示して安全に終了するようにしています。

まとめ

VBAの Name ステートメントは、ファイルの移動や名前変更を簡単に行うための強力なツールです。特に経理業務における「処理済みファイルのアーカイブ」という定型作業において、その真価を発揮します。 ただし、ただ単純に Name を使うだけでなく、移動先に同名のファイルが存在する際の「File already exists エラー」を回避するための堅牢なコードを実装することが、自動化を成功させる鍵となります。 今回ご紹介した「ファイルの存在チェック」「上書き確認」「エラーハンドリング」を組み合わせることで、安全かつ信頼性の高いVBAマクロを構築し、日々の業務効率を大幅に向上させることができるでしょう。ぜひ、この記事のコードを活用して、経理業務の自動化を推進してください!

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら