ファイルの拡張子を取得する

ファイルの拡張子を取得する

車輪の再発明

ファイル名の拡張子を取得したくて、次のようなコードを書いた。

ちなみに、マクロを書いたブックのあるフォルダ内のTargetFilesフォルダ内に、次のようにファイルがあるものとする。

f:id:akashi_keirin:20190405220822j:plain

リスト1 標準モジュール
Public Sub test01()
  Set fsObj = New FileSystemObject
  Dim targetFolder As Folder
  Set targetFolder = _
    fsObj.GetFolder(ThisWorkbook.Path & "\TargetFiles\")  '"
  Dim targetFile As File
  For Each targetFile In targetFolder.Files
    Dim ar As Variant    '……(1)'
    ar = Split(targetFile.Name, ".")
    Debug.Print ar(UBound(ar))
  Next
End Sub

拡張子を取り出すために、(1)からの3行

Dim ar As Variant
ar = Split(targetFile.Name, ".")
Debug.Print ar(UBound(ar))

で、ファイル名を一旦Splitによって「.」で分割して配列にぶち込む。拡張子は必ず一番右端の「.」の右側のはずなので、配列の最終要素に拡張子がぶち込まれる、という考え方。

こういうことがサッと思いついたとき、

わし、もしかして天才じゃないか?

とか、思うわけですよ。

でもまあ、たいていそういうのは、

車輪の再発明

に過ぎないわけです。

これもまさにそう。

GetExtentionNameメソッド

おなじみ、FileSystemObjectオブジェクトには、GetExtentionNameメソッドというものがある。その名の通り、ファイルから拡張子名を取り出すメソッド。

こいつを用いて、先のリスト1を書き換える。

スト2 標準モジュール
Public Sub test02()
  Set fsObj = New FileSystemObject
  Dim targetFolder As Folder
  Set targetFolder = _
    fsObj.GetFolder(ThisWorkbook.Path & "\TargetFiles\")  '"
  Dim targetFile As File
  For Each targetFile In targetFolder.Files  '……(2)'
    Debug.Print targetFile.Path  '……(3)'
    Debug.Print fsObj.GetExtensionName(targetFile.Path)  '……(4)'
  Next
End Sub

見たらわかると思うが、変えたのは(2)からの4行。

For EachNextFolderオブジェクト配下のFilesコレクションの要素(=Fileオブジェクト)に一つづつアクセスする。

(3)の

Debug.Print targetFile.Path

では、FileオブジェクトのPathプロパティの値をイミディエイト・ウインドウに表示。

「ファイルの拡張子を取得する」という目的に照らせば、必要のないコード。

ただ、Pathプロパティの意味がThisWorkbook.Pathの「Path」とは異なるので、参考のために書いた。

あとは、(4)の

Debug.Print fsObj.GetExtensionName(targetFile.Path)

FileSystemObjectオブジェクトのGetExtentionNameメソッドを用いて拡張子名を取り出し、イミディエイト・ウインドウに表示する。

実行結果

f:id:akashi_keirin:20190405220807j:plain

この状態で実行すると、

f:id:akashi_keirin:20190405220813j:plain

こうなった。

FileオブジェクトのPathプロパティがファイルのフルパスを返す、というのは初めて知った。

おわりに

FileSystemObjectチョー便利じゃん。