みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでファイルやフォルダを操作する方法についてあれこれお伝えしています。
前回はこちらの記事でした。
マクロのファイルを開いたら、自動でエクセル以外のアプリケーションのものも含む他のファイルを一気に開くプログラムをお伝えしました。
さて、今回ですが
- 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を開いて書き換えないといけないので不便です。
まずその点を解消していきたいと思います。
エクセルシートに記載したファイルを全て開く
そんなときは、エクセルシートに該当のファイルのフルパスを書いてしまいます。
こんなシートを作りました。
このシートの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関数は引数のパターンにマッチしたファイルまたはフォルダ名を返す関数です。
なんじゃそりゃ?って感じですが、使い方次第で色んなことができる便利な関数なのです。
例えば
とすると
- ファイルが存在する:ファイル名自体
- ファイルが存在しない:長さ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メソッドで同様のことをする方法を以下記事で紹介していますので、よろしければこちらもご覧ください。
次回はこのツールをさらに便利にすべく、ファイルが存在していなかったときに指定できるよう、ダイアログの使い方をお伝えします。
どうぞお楽しみに!