皆さん、こんにちは。Excel VBA講師です。実務で他部署から送られてきたExcelブックを処理する自動化ツールを作っているとき、こんな経験はありませんか?
「朝一番にマクロを動かしたら、ファイルパスが変わっていて実行時エラーで止まってしまった」
今日は、VBA開発において避けては通れない「お探しのページ(ファイル)がみつかりませんでした」という事態を、いかにエレガントに、そして実務的に解決するかというお話をします。
なぜ「On Error Resume Next」だけでは不十分なのか
多くの初心者は、ファイルを開く処理の直前に「On Error Resume Next」を書き、エラーを無視しようとします。しかし、これは危険です。ファイルが開けなかったのか、あるいは開いた後に別の場所でバグが発生したのかが判別できなくなるからです。
実務で求められるのは、エラーを無視することではなく、「エラーを予測して先回りすること」です。
Dir関数で「存在確認」をルーチン化する
最もシンプルかつ強力な方法は、ファイルを開く前に「そのファイルが本当にそこに存在するか」を確認することです。
例えば、以下のように記述します。
Dim filePath As String
filePath = “C:\Data\売上集計.xlsx”
If Dir(filePath) = “” Then
MsgBox “ファイルが見つかりません。” & vbCrLf & “パスを確認してください:” & filePath, vbCritical
Exit Sub
End If
Workbooks.Open filePath
たったこれだけの記述ですが、エラーでマクロが強制終了するのと、親切なメッセージを出して終了するのとでは、運用上のストレスが全く違います。
実務現場での「ファイル移動」リスクへの対策
さらに一歩進んだテクニックとして、ファイル名の一部が毎回変わる場合(例:売上集計_20231027.xlsx など)の対策があります。
この場合、Dir関数のワイルドカードを使います。
Dim folderPath As String, fileName As String
folderPath = “C:\Data\”
fileName = Dir(folderPath & “売上集計_.xlsx”)
If fileName = “” Then
MsgBox “対象ファイルがフォルダ内に存在しません。”
Exit Sub
End If
Workbooks.Open folderPath & fileName
このように書けば、日付が変わってもファイル名が微妙に変化しても、マクロが止まることはありません。
エラーハンドリングは「メンテナンスの質」を決める
プログラムは書いて終わりではありません。数ヶ月後に他の誰かが触ったとき、あるいは半年後にファイルサーバーの構成が変わったとき、「なぜ動かないのか」が瞬時にわかるコードこそが、プロフェッショナルなVBAコードです。
「ファイルがない」という事態は、システムエラーではなく「運用上の想定内」として扱いましょう。エラーメッセージを自分でコントロールできるようになれば、あなたのツールは一気に実務で信頼されるものへと昇格します。
次回は、パスが間違っている場合だけでなく、「ファイルが既に誰かによって開かれている」という排他制御のエラーへの対処法について解説します。それでは、また。
