エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法


file-folder

photo credit: greenplasticamy 02.07.2014 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでファイルやフォルダを操作する方法についてあれこれお伝えしています。

前回はこちらの記事でした。

エクセルVBAでエクセル以外の他のアプリケーションを開く方法
エクセルVBAでファイルを開く作業を自動化する方法をお伝えしています。今回はエクセルVBAでエクセル以外の他のアプリケーションのファイルを開く方法としてShellオブジェクトの使い方をお伝えします。

マクロのファイルを開いたら、自動でエクセル以外のアプリケーションのものも含む他のファイルを一気に開くプログラムをお伝えしました。

さて、今回ですが

  • VBAコード内に記載していたファイルのフルパスをシートに記載する
  • Dir関数で指定のファイルが存在しているかどうかを判定する

という二つの改善をしていきたいと思います。

では、よろしくお願いいたします。

スポンサーリンク

前回のおさらい

まず、前回のおさらいから。こちらのプログラムでした。

Sub Auto_Open()

With CreateObject("Shell.Application")
    .ShellExecute "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\エクセル-1.xlsx"
    .ShellExecute "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\エクセル-2.xlsx"
    .ShellExecute "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\PDF.pdf"
    .ShellExecute "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\ワード.docx"
End With

End Sub

Shellオブジェクトを使ってエクセル、PDF、Wordの計4つのファイルを開くというものですね。Auto_Openイベントプロシージャですから、このファイルが開いたときに実行されます。

ただ、VBA内にファイル指定しちゃうと、これらのファイルのパスが変更になったり、新たなファイルを使いしたい、などというときには、いちいちVBAを開いて書き換えないといけないので不便です。

まずその点を解消していきたいと思います。

エクセルシートに記載したファイルを全て開く

そんなときは、エクセルシートに該当のファイルのフルパスを書いてしまいます。

こんなシートを作りました。

VBAで開くファイルをエクセルシートにリスト
このシートの2行目から最後まで繰り返して、各行についてフルパスについてShellExecuteメソッドを使えばOKですよね。

プログラムをこのように書き換えました。

Sub Auto_Open()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim shell As Object: Set shell = CreateObject("Shell.Application") //Shellオブジェクトを生成してセット

Dim i As Long
i = 2
Do While ws.Cells(i, 1).Value <> ""
    shell.ShellExecute ws.Cells(i, 2).Value //B列に記載されたフルパスでファイルを開く
    i = i + 1
Loop

End Sub

これでOKですね。

Do While~Loopを使っていますので、行数が増えてもVBAの変更なして対応可能です。

開くファイルが見つからないとエラーになる

ちなみにですが、ファイルの場所が変更になったとき、フルパスを変更していないと、こんな感じで怒られます。

ファイルがなかったときのエラーメッセージ

…が見つかりません。名前を正しく入力したかどうかを確認してから、やり直してください。

とのエラーです。真っ赤なバッテンマークがついているので、ちょっとドキっとしますね。

そうなんです、ファイルの場所が変更になったら、ユーザーが先回りでシートに記載のフルパスを変更しないといけないんですね。…んー、ちょっとそれは面倒、というか多分忘れる。

Dir関数でファイルが存在するかどうかを判定する

では、どうするか?ということなのですが、事前に該当のファイルが存在しているかどうかをチェックすればよいんですね。

Dir関数を使います。Dir関数は引数のパターンにマッチしたファイルまたはフォルダ名を返す関数です。

なんじゃそりゃ?って感じですが、使い方次第で色んなことができる便利な関数なのです。

例えば

Dir(ファイルのフルパス)

とすると

  • ファイルが存在する:ファイル名自体
  • ファイルが存在しない:長さ0の文字列(””)

が返ります。ですから、Dirの返り値の文字列が「””」かどうかを判定すれば、そのファイルの有無を判定できるということになります。

ファイルの存在判定を入れたプログラム

今回のプログラムでいうと、ファイルを開く前にif文の条件にDir関数を使って判定を入れれば良さそうですね。

このようになります。

Sub Auto_Open()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim shell As Object: Set shell = CreateObject("Shell.Application")

Dim i As Long
i = 2
Do While ws.Cells(i, 1).Value <> ""
    If Dir(ws.Cells(i, 2).Value) <> "" Then
        shell.ShellExecute ws.Cells(i, 2).Value
    Else
        MsgBox "ファイル " & ws.Cells(i, 2).Value & " が存在しません", vbInformation
    End If
    i = i + 1
Loop

End Sub

ファイルが存在しなかた場合は

ファイルが存在しなかったときに表示するメッセージ

このようにメッセージが表示されます。

まとめ

エクセルVBAでDir関数を使ってファイルの存在を判定する方法をお伝えしました。

Dir関数ですが、ファイルの有無に限らず、以下のように幅広い用途で活用ができます。

  • フォルダの有無の判定
  • 特定の拡張子や属性のファイルの判定
  • ファイル一覧の表示
  • サブフォルダ一覧の表示

以降のシリーズで都度便利な使い方をお伝えしていきますね。

なお、Dir関数ではなくFileSystemオブジェクトのFileExistsメソッドで同様のことをする方法を以下記事で紹介していますので、よろしければこちらもご覧ください。

【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
エクセルVBAのFileSystemオブジェクトでファイルやフォルダの操作をする方法をお伝えしています。今回はFileExists、FolderExistsメソッドでファイル・フォルダの存在を判定します。

次回はこのツールをさらに便利にすべく、ファイルが存在していなかったときに指定できるよう、ダイアログの使い方をお伝えします。

エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
エクセルVBAでファイルを開く作業を自動化する方法についてシリーズでお伝えしています。今回は、エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法です。

どうぞお楽しみに!

連載目次:エクセルVBAでファイルやフォルダを操作する方法

お仕事でいつも決まったファイルをいつも一つずつダブルクリックして開くの…毎日だと思うと面倒ですよね。 このシリーズでは、ファイルを自動で開く、フォルダ一覧を出力するなど、エクセルVBAでファイルやフォルダを操作する方法についてお伝えしていきます。
  1. エクセルVBAでブックを開いたときに他のワークブックも一緒に自動で開く
  2. エクセルVBAでエクセル以外の他のアプリケーションを開く方法
  3. エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法
  4. エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
  5. エクセルVBAでフォルダ内のファイル一覧を表示するDir関数の使い方
  6. エクセルVBAでDir関数を使ってフォルダ一覧を表示する方法

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