Excel VBAでファイルをコピーしたり削除したりする処理を書くとき、「FileSystemObjectを使わないといけない」と思っていませんか。実は、VBAには参照設定なしでそのまま使えるネイティブなステートメント(FileCopy・Kill・MkDir・RmDir・Name)が用意されています。
この記事では、これらのステートメントの基本的な使い方と、実務でよくある「バックアップファイルを自動作成する」処理への応用例、使用時に注意すべき点を解説します。
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関数で行う:FileCopyやKillはファイルが存在しないとエラーになるため、実行前にDir関数で存在を確認する習慣をつけましょう。 - エラーハンドリングを併用する:ファイルが他のアプリで開かれている、アクセス権限がないなど、実行時にしか分からないエラーも発生します。
On Errorステートメントで想定外のエラーに備えると安全です。 - 大量のファイル操作にはFileSystemObjectも検討する:フォルダを再帰的に探索したり、ファイル情報を詳しく取得したりする複雑な処理には、
FileSystemObjectのほうが向いている場合もあります。シンプルなコピー・削除・作成であれば、参照設定が不要なネイティブステートメントで十分です。
まとめ
FileCopyはファイルのコピー、Killはファイルの削除を行うMkDirはフォルダの作成、RmDirは空のフォルダの削除を行うNameはファイルの移動・リネームに使うKillで削除したファイルはごみ箱を経由せず完全に削除されるため注意が必要- いずれも参照設定不要で手軽に使える一方、存在チェックとエラーハンドリングを組み合わせることで安全に運用できる
これらのステートメントを組み合わせれば、参照設定を追加することなく、日常的なファイル操作の自動化が可能になります。ぜひバックアップ処理やファイル整理のマクロに活用してみてください。


コメント