「あれ、ファイルがない…」でマクロを止めないために
「プログラムを実行したのに、ファイルがなくてエラーで止まった。また最初からやり直しだ……」
こんな苦い経験に身に覚えはありませんか?
VBAで外部のファイルを操作するとき、最も重要なのは「対象のファイルが実際に存在するかどうか」を事前に確認することです。このような事前確認の手続きを、「バリデーション(妥当性確認)」と呼びます。
そこで役立つのが、パソコン内のファイルやフォルダを効率的に管理できる「FSO(FileSystemObject)」という機能になります。
そもそもFSO(FileSystemObject)とは?
FSOは、Windowsのファイルやフォルダを自由自在に操るための便利な機能です。
Excel標準の機能(Dir関数など)でも確認はできますが、FSOの方が「フォルダの有無」や「ファイルの詳細」を扱うのが得意で、コードが読みやすくなるというメリットがあります。
【実践】ファイルとフォルダの存在を確認するVBAコード
それでは、コピペして活用できる具体的なコードをご紹介します。
今回は「ファイルの存在確認」と「フォルダの存在確認」の2つのパターンを用意いたしました。
Sub CheckFileAndFolder()
' 1. FSOを呼び出す準備
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim targetFile As String
Dim targetFolder As String
' 確認したいパスを指定(ここを自分の環境に合わせて変えてください)
targetFile = "C:\Users\Public\Documents\SalesData.xlsx"
targetFolder = "C:\Users\Public\Documents\Report"
' --- ファイルの存在確認 ---
' fso.FileExists(パス) で、あれば True、なければ False が返る
If fso.FileExists(targetFile) Then
MsgBox "ファイルが見つかりました!処理を続行します。", vbInformation
Else
MsgBox "【エラー】ファイルがありません!パスを確認してください。", vbExclamation
Exit Sub ' ファイルがないのでここで終了
End If
' --- フォルダの存在確認 ---
' fso.FolderExists(パス) で判定
If fso.FolderExists(targetFolder) Then
MsgBox "保存先フォルダもバッチリあります。", vbInformation
Else
MsgBox "フォルダがなかったので、新しく作るなどの処置が必要です。", vbCritical
End If
' 2. 使い終わったら片付ける
Set fso = Nothing
End Sub
なぜこの一工夫が必要なのか?
「わざわざ確認コードを入れなくても、ファイル名さえ合っていれば問題なく動くのでは?」と思われるかもしれません。
しかし、実際の現場では以下のようなトラブルが日常茶飯事に起こります。
- ネットワーク上の共有フォルダのパスが、知らない間に変更されていた
- 前工程の担当者が、ファイル名を「202603_売上.xlsx」から「202603_売上(修正).xlsx」に変えてしまった
この確認コードをあらかじめ入れておくだけで、エラー画面を前に立ち尽くすような「無駄な時間」をゼロにすることができます。
まとめ:エラーに強いスマートなVBAを書こう
VBAを書けるようになるだけでもすごいことですが、「エラーが起きる可能性を先回りして潰して回避する」設計ができるようになると、さらなるステップアップに繋がります。
まずは、今作っているマクロにfso.FileExists を追加してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント