【ExcelVBA】Dir関数の落とし穴「拡張子」

ExcelVBA
記事内に広告が含まれています。

Dir関数は簡単で便利な関数ですが、実は以外な落とし穴があります。

それは、「拡張子」の扱いです。

サイト運営者
moGLutton(モグラットン)

エンジニア歴15年。フリーランスになって3年目。
在宅で、RPA開発をメインにシステム開発やブログ運営などしています。

moGLutton(モグラットン)をフォローする

Dir関数では「拡張子」が部分一致になる

例1:エクセルファイルの拡張子

業務でよくあるのですが、

例えば、あるフォルダ内のエクセルファイルだけを取得したい場合、

こう書くと思います。

Dir(“C:\Users\ユーザー名\Desktop¥*.xlsx”)

「.xlsx」という拡張子がついている全てのファイル、

つまりエクセルファイルだけを取得できます。

ちなみに、「.xlsx」はExcel2007以降のバージョンのファイルです。

でも、

それ以前のバージョンのエクセル、

つまり拡張子が「.xls」のファイルのみ取得したいこともあると思います。

その場合、おそらく、こう書きます。

Dir(“C:\Users\XXX\Desktop¥*.xls”)

これには注意が必要です。

こう書くと、拡張子が「.xls」で始まるファイルという意味になってしまい、

なんと、「.xlsx」や「.xlsm」(マクロファイル)までもが対象になってしまいます!

これはVBAではなくWindowsの仕様のようで、以外な落とし穴ですよね。

なので、

「.xls」だけを取りたいときは、

すごく面倒なんですが、Dir関数から返ってきたファイル名をチェックする必要があります。

Dim 変数 As String

変数 = Dir(“C:\Users\ユーザー名\Desktop\*.xls”)

Do While 変数 <> “”
     ‘拡張子が「.xls」のファイルのみ処理する
     If LCase(変数) Like “*.xls” Then
        ‘ここに、やりたい処理を書く
     End If

  ‘次のファイル名を取得する
  変数= Dir()
Loop

LCaseは、大文字アルファベットを小文字に変えてくれる関数です。

拡張子が大文字アルファベットの場合を考慮しています。

そして、Likeは、そのあとに書いている”*.xls”に一致しているか、をチェックします。

つまり、LCase(変数) Like “*.xls” とは、LCase(変数)に”*.xls”が含まれているか、

つまり、拡張子が”.xls”か、をチェックしています。

拡張子が”.xls”の場合のみ、処理を行えばいいですね。

例2:htmlファイルの拡張子

同じように、

「.htm」だけを取りたいときは、「.html」もあることを忘れずに、

先ほど書いたような拡張子チェックを入れた方がいいです。

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