【VBA】ファイル存在確認の鉄板コード!Dir関数とFSOでエラー1004を回避

【業務効率化】VBA
スポンサーリンク

こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!

マクロを実行した瞬間に「実行時エラー ‘1004’: ‘(ファイル名)’ が見つかりません」 というエラー画面が出て、パニックになったことはありませんか?

私自身、あのエラー画面が表示されると一瞬ドキッとしてしまいます。
特に、自作のツールを他人に使ってもらっている最中にこのエラーが出ると、なんとも言えない気まずい空気が流れて辛いものですよね。

この記事では、そんな事故を未然に防ぎ、エラー画面をシャットアウトする「防波堤」のようなコードを解説します。

手軽な「Dir関数」と、実務で重宝される「FileSystemObject(FSO)」の2パターンを用意しました。

【業務効率化】VBAの記事を見る

なぜ「ファイル存在確認」の一手間が必要なのか?

例えば、「売上データ.xlsx」を開いて集計するマクロを作成したとしましょう。

しかし、もし誰かがそのファイルを「売上データ_2025.xlsx」に名前を変えていたり、別のフォルダに移動させていたらどうなるでしょうか?

事前の確認なしにファイルを開こうとすると、Excelは「指定されたファイルがない!」と判断し、マクロをその場で強制終了させてしまいます。

これを防ぐには、開く命令を出す直前に「そこにファイルはありますか?」と確認するステップを挟むのが定石です。

方法①:コピペで即解決!基本の「Dir関数」

まずは、特別な設定が不要で最も手軽に使える「Dir(ディレクトリ)関数」を使った手法です。

わずか数行の追加で導入できるため、まずはこの方法から試してみてください。

コード(標準モジュールにコピペOK)

Sub ファイル存在確認をしてから開く_Dir版()

    ' 1. 開きたいファイルの場所を指定
    Dim targetPath As String
    targetPath = "C:\Users\User\Desktop\売上データ.xlsx"

    ' 2. ファイルがあるかチェックする
    ' Dir関数は、ファイルが存在すればその名前を、なければ空文字("")を返します
    If Dir(targetPath) <> "" Then
       
        ' ファイルがある場合の処理
        Workbooks.Open targetPath
        MsgBox "無事にファイルを開きました!", vbInformation
       
    Else
       
        ' ファイルがない場合の処理
        ' エラー画面を出さずに、メッセージを出して終了
        MsgBox "指定されたファイルが見つかりませんでした。" & vbCrLf & _
              "場所や名前が変わっていないか確認してください。" & vbCrLf & _
              "探した場所:" & targetPath, vbExclamation
             
    End If

End Sub

解説

ここで使っているのは、VBAに標準搭載されている「Dir関数」です。

PCに対して、「指定の場所にファイルはある? あれば名前を、なければ空文字(””)を返して」と指示を出しているイメージだと考えると分かりやすいでしょう。

方法②:より確実で高機能!「FileSystemObject (FSO)」

「将来的にはファイルの移動や削除、フォルダ作成なども自動化したい」という方には、この「FileSystemObject(通称FSO)」が最適です。

Dir関数よりも挙動が安定しており、複雑なファイル操作に特化した強力なツールです。

コード(FSO版)

Sub ファイル存在確認をしてから開く_FSO版()

    Dim targetPath As String
    targetPath = "C:\Users\User\Desktop\売上データ.xlsx"

    ' ファイルシステムオブジェクトの準備
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' FileExistsメソッドでチェック
    If fso.FileExists(targetPath) = True Then
       
        Workbooks.Open targetPath
        MsgBox "FSOを使ってファイルを開きました!", vbInformation
       
    Else
       
        MsgBox "ファイルが見つかりません。" & vbCrLf & _
              "パス:" & targetPath, vbExclamation
             
    End If

    ' 後片付け
    Set fso = Nothing

End Sub

結局、どちらを使うべき?状況別の使い分けガイド

「結局、どっちを使えばいいの?」と迷ったときは、以下の基準で選べば間違いありません。

手法メリットおすすめのシーン
Dir関数コードが短く、準備がいらない。とりあえずサクッと存在確認したい時。
FSO作成日やサイズの取得など、多機能。本格的なツール作成や大量のファイル操作時。

現場で「ちょっとファイルを安全に開きたい」という場面なら、まずはDir関数で十分です。まずは扱いやすい方法をマスターして、エラーに強いコードを書ける自信をつけていきましょう!

まとめ

今回のポイントをおさらいします。

  1. エラーは「準備不足」なだけ。コードを開く前に存在確認を挟もう。
  2. 手軽なDir関数、確実なFSO、好きな方を使ってOK。
  3. エラーメッセージを日本語にしてあげるだけで、使う人は安心する。

不測の事態に備えるコードを書いて、脱・初心者を目指しましょう!

【業務効率化】VBAの記事を見る


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

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