【ExcelVBA・マクロ】FileCopy・Kill・MkDirステートメントの使い方|FSOなしでファイル操作する基本【コピペOK】

ExcelVBA

Excel VBAでファイルをコピーしたり削除したりする処理を書くとき、「FileSystemObjectを使わないといけない」と思っていませんか。実は、VBAには参照設定なしでそのまま使えるネイティブなステートメント(FileCopyKillMkDirRmDirName)が用意されています。

この記事では、これらのステートメントの基本的な使い方と、実務でよくある「バックアップファイルを自動作成する」処理への応用例、使用時に注意すべき点を解説します。

スポンサーリンク
スポンサーリンク

FileCopyステートメント:ファイルをコピーする

FileCopyは、指定したファイルを別の場所にコピーするステートメントです。コピー元とコピー先のパスを指定するだけで使えます。

Sub CopyFileSample()
    Dim sourcePath As String
    Dim destPath As String

    sourcePath = "C:\Work\売上データ.xlsx"
    destPath = "C:\Work\Backup\売上データ_コピー.xlsx"

    FileCopy sourcePath, destPath

    MsgBox "コピーが完了しました"
End Sub

コピー先のフォルダが存在しない場合はエラーになるため、事前にフォルダの存在を確認しておく必要があります(フォルダ作成については後述のMkDirを参照してください)。また、コピー元のファイルが他のプロセスで開かれている(排他ロックされている)とエラーになる点にも注意してください。

Killステートメント:ファイルを削除する

Killは、指定したファイルを削除するステートメントです。ワイルドカード(*?)を使って複数ファイルをまとめて削除することもできます。

Sub DeleteFileSample()
    Dim targetPath As String
    targetPath = "C:\Work\Temp\作業用一時ファイル.txt"

    If Dir(targetPath) <> "" Then
        Kill targetPath
        MsgBox "削除しました"
    Else
        MsgBox "ファイルが見つかりません"
    End If
End Sub

Killで削除したファイルはごみ箱を経由せず、完全に削除されます。 元に戻すことができないため、削除対象のパスを直接入力する処理や、ワイルドカードで一括削除する処理を書く際は、対象を十分に確認してから実行してください。

MkDirステートメント:フォルダを作成する

MkDirは、指定した名前のフォルダを新規作成するステートメントです。

Sub CreateFolderSample()
    Dim folderPath As String
    folderPath = "C:\Work\Backup"

    If Dir(folderPath, vbDirectory) = "" Then
        MkDir folderPath
        MsgBox "フォルダを作成しました"
    Else
        MsgBox "フォルダは既に存在します"
    End If
End Sub

MkDirは、親フォルダがすでに存在していないと実行できません。例えばC:\Work\Backup\2026のように途中のフォルダ(C:\Work\Backup)が存在しない状態で一度に作成しようとするとエラーになるため、深い階層のフォルダを作る場合は1階層ずつMkDirを呼び出す必要があります。

RmDirステートメント:フォルダを削除する

RmDirは、指定したフォルダを削除するステートメントです。ただし、フォルダの中にファイルやサブフォルダが1つでも残っていると削除できず、エラーになります。

Sub RemoveFolderSample()
    Dim folderPath As String
    folderPath = "C:\Work\Temp"

    On Error Resume Next
    RmDir folderPath
    On Error GoTo 0

    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "フォルダを削除しました"
    Else
        MsgBox "フォルダの中身が空でないため削除できませんでした"
    End If
End Sub

中身ごと削除したい場合は、フォルダ内のファイルをKillで個別に削除してからRmDirを実行する必要があります。

Nameステートメント:ファイルの移動・リネーム

Nameは、ファイルの名前を変更したり、別のフォルダへ移動したりするステートメントです。コピーと違い、元のファイルはその場所からなくなります。

Sub MoveFileSample()
    Dim oldPath As String
    Dim newPath As String

    oldPath = "C:\Work\Temp\report.xlsx"
    newPath = "C:\Work\Archive\report.xlsx"

    Name oldPath As newPath

    MsgBox "ファイルを移動しました"
End Sub

実践例:日付付きバックアップフォルダを自動作成する

ここまで紹介したステートメントを組み合わせると、日付ごとにフォルダを作成してファイルをバックアップする処理を、FileSystemObjectを使わずに実現できます。

Sub CreateDailyBackup()
    Dim baseFolder As String
    Dim backupFolder As String
    Dim todayStr As String

    baseFolder = "C:\Work\Backup"
    todayStr = Format(Date, "yyyymmdd")
    backupFolder = baseFolder & "\" & todayStr

    ' バックアップ先フォルダがなければ作成する
    If Dir(backupFolder, vbDirectory) = "" Then
        MkDir backupFolder
    End If

    ' 現在のブックを日付フォルダにコピーする
    FileCopy ThisWorkbook.FullName, backupFolder & "\" & ThisWorkbook.Name

    MsgBox "バックアップが完了しました: " & backupFolder
End Sub

日次バックアップのように、決まった処理を毎回同じロジックで実行したい場合に便利な構成です。

使用時の注意点

  • 存在チェックはDir関数で行うFileCopyKillはファイルが存在しないとエラーになるため、実行前にDir関数で存在を確認する習慣をつけましょう。
  • エラーハンドリングを併用する:ファイルが他のアプリで開かれている、アクセス権限がないなど、実行時にしか分からないエラーも発生します。On Errorステートメントで想定外のエラーに備えると安全です。
  • 大量のファイル操作にはFileSystemObjectも検討する:フォルダを再帰的に探索したり、ファイル情報を詳しく取得したりする複雑な処理には、FileSystemObjectのほうが向いている場合もあります。シンプルなコピー・削除・作成であれば、参照設定が不要なネイティブステートメントで十分です。

まとめ

  • FileCopyはファイルのコピー、Killはファイルの削除を行う
  • MkDirはフォルダの作成、RmDirは空のフォルダの削除を行う
  • Nameはファイルの移動・リネームに使う
  • Killで削除したファイルはごみ箱を経由せず完全に削除されるため注意が必要
  • いずれも参照設定不要で手軽に使える一方、存在チェックとエラーハンドリングを組み合わせることで安全に運用できる

これらのステートメントを組み合わせれば、参照設定を追加することなく、日常的なファイル操作の自動化が可能になります。ぜひバックアップ処理やファイル整理のマクロに活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました