Dir関数は簡単で便利な関数ですが、実は以外な落とし穴があります。
それは、「拡張子」の扱いです。
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」もあることを忘れずに、
先ほど書いたような拡張子チェックを入れた方がいいです。