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

ExcelVBA

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

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

サイト運営者
momo

知識ゼロから正社員→派遣→フリーランスになった関西出身の40代女ITエンジニア。エンジニアの世界を女性視点で本音で語ります。関西弁がちょっと強め。

momoをフォローする
003_midworks_img_300x250

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」もあることを忘れずに、

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

既にフリーランスで今の案件に不満がある人も、今からフリーランスを目指す人も、エージェントを利用すれば年収600万も夢じゃありません。
難しい契約や交渉はエージェントにお任せ。1人で仕事を探すより、圧倒的に早く仕事が見つかります。
登録は無料で、その後の無料面談では自分の市場価値や将来性も確認できます。

ExcelVBA
momoをフォローする
タイトルとURLをコピーしました