Dir関数でファイル見つからない?相対パスでハマってません?w【サンプルコード有り】

はじめに

VBAで特定のファイルが有るか確認をすることがあると思います。例えば、ログを追記しているファイルの有無を確認し、あった場合は追加モードでログを書き込んでなかったら新規にファイルを作成する、などと言った処理の際が想定されます。

このファルの有無を確認する方法としてVBAだとDir関数を使うかFileSystemObjectを使うことになると思います。ここでFileSystemObjectは外部からオブジェクトを呼び出さねばならず、処理が複雑化します。それに対してDir関数はVBAの組み込み関数なので、比較的簡単に使えます。

しかし、Dir関数をちょっと使ってみよう!というノリで使うと思わぬところでハマる可能性があります。ちなみに私はハマりました笑。今回はこのDir関数を使っていて余計なところでハマっている人向けに記事を書こうと思います。

Dir関数でファイル見つからないときの本記事の目的

本記事ではVBAでファイルの有無を確認するときに使うDir関数で余計なところでハマらないように、相対パスなどでハマるのを回避してスムーズにファイルの有無を確認できる方法を簡潔にご説明します。Dir関数はファイルを指定する場合に絶対パスと相対パスによる指定ができます。

しかし、相対パスで自分のディレクトリからファイル名を指定した結果、同一フォルダ内にファイルが有るにも関わらず処理がスルーされるということが頻発しました。これはDir関数の使い方を紹介する複数のVBA解説サイトでパスの指定に統一がないことが原因でした(もちろん私の技量不足もあります!)。

なので、今回自分でDir関数を使用することで「これなら確実に動いたぞ!」というソースをご紹介します。VBAも環境や仕様によって動いたり動かなかったりする部分があり、ガチよりのエンジニアだったらそうした状況は受け入れられないかもしれませんが、まずは自動化を優先する我々としてはひとまずの光明を見出すところまでたどり着きたいはずです!

Dir関数の仕様など

Dir関数の仕様はこちらを御覧ください。一部を抜粋します。

Dir関数でファイル見つからないときのソースコード

それではソースコードです!ファイルが見つからないときはThisbook.PathでVBA実行ファイルまでのパスを取得してからファイル名を指定する方法が確実です。これは絶対パスを指定していることになりますが、仕様や環境に左右されない確実な方法です。骨折り損をくらわないためにも、硬い方法を取るべきとの考えに基づきます。

ちなみにDir関数でファイルが存在するとファイル名がStringで戻り値として戻ってきますので、それをデバッグプリントでイミディエイトウインドウに表示しています。

 

Sub DirCheck()

Dim Exists As String

'同一フォルダ内にsamplefile.xlsxがある場合
'samplefile.xlsx を検索したいファイルの名前に変えてください
Exists = Dir(ThisWorkbook.Path & "\samplefile.xlsx")

Debug.Print(Exists)

End Sub

おわりに

今回はDir関数でありがちな相対パスでハマるのを回避する方法をご紹介しました。解決策は非常に安易だったかもしれませんが、しかしこの方法を使うことで汎用性を持って仕様や環境に依存しないパスを構築することができました。

VBAに限りませんが、コンピューターは人間のような柔軟性がないので、ちょっとした変化ですぐに「???」が発生します。自動化を志す中でこうしたコンピューターの応用力のなさに気分を害されることもあるかと思います。

しかし、そうした苦難を乗り越えた先にある自動化の恩恵を考えると、少々のトラブルで諦めてしまうのは大変勿体有りません。どうか気長にVBAやPythonによる自動化と向き合ってください!