和風スパゲティのレシピ

日本語でコーディングするExcelVBA

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

ファイル名から拡張子を取り出す方法を解説します。

FileSystemObjectGetExtensionNameメソッドを利用する方法と、
InstrRev関数&Right/Mid関数を使用する方法の2種類があります。

FSO.GetExtensionNameメソッド

FileSystemObjectにはGetExtensionNameメソッドという
ファイルパスから拡張子を取得する専用のメソッドがあります。

このメソッドを用いて、以下のコードで拡張子を取得できます。

Sub 拡張子を取得する()
    
    Dim FSO As New FileSystemObject
    
    Dim 拡張子 As String
    
    Dim ファイルパス As String: ファイルパス = ThisWorkbook.FullName
    Dim ファイル名 As String: ファイル名 = ThisWorkbook.Name
    
    拡張子 = FSO.GetExtensionName(ファイルパス)
    Debug.Print 拡張子 '「xlsm」が表示されます。
    
    拡張子 = FSO.GetExtensionName(ファイル名)
    Debug.Print 拡張子 '同じく「xlsm」が表示されます。
    
    拡張子 = FSO.GetExtensionName("存在しないファイル名.abcde")
    Debug.Print 拡張子  '「abcde」が返ります。
    
    拡張子 = FSO.GetExtensionName("あああああ")
    Debug.Print 拡張子  '「""」が返ります。
    
End Sub

 
上記コードの通り、ファイル名、ファイルパスどちらにも対応しており、
加えて存在しないファイル名や、存在しない拡張指名も取得できます。

ファイルの拡張子を調べるメソッドというよりは、
単純に「最後のドット"."から右側を取ってくる」メソッドですね。

"."が一切ない文字列を渡すとエラーにはならず""を返します。


ファイルが存在しないと使えないなどの制約もありませんので、
基本的にはこちらのメソッドを使っておけばOKです。


なお、FileSystemObjectを使用するためには、
「Scripting Runtime」の参照設定が必要です。

設定方法についてはこちらの記事をご覧ください。

参照設定せずにCopyFileメソッドを使用したいときは、

Dim FSO As New FileSystemObject

' ⇩ 書き換え

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

このように書き換えることで参照設定なしで使用できますが、
FileSystemObjectは参照設定が推奨される機能です。

慣れれば10秒かかりませんので、
よほどお急ぎでない限りは参照設定をしたうえでご利用ください。

※ 参照設定が推奨される理由も上記の記事で説明しています

InstrRev関数 & Right/Mid関数

先ほど「最後のドット"."から右側を取ってくる」メソッドと説明しましたが、
これをそのまま実行して取得する方法もあります。

文字列を後方(右側)から検索する「InstrRev関数」と、
文字列の後方(右側)を取得する「Right/Mid関数」を使用します。

' ① 右から取ってくるバージョン
拡張子 = Right(ファイル名, Len(ファイル名) - InStrRev(ファイル名, "."))

' ② 左を捨てるバージョン
拡張子 = Mid(ファイル名, InStr(ファイル名, ".") + 1)

 
InstrRev関数は「Instr関数の右から検索する版」なのですが、
見つけた時に返す結果値は「左(前方)」から数えた文字数になります。

拡張子を検索していると「5」や「4」を返すような気がしてしまいますが、
実際は「123456789.xlsx」だと「10」を返しますのでご注意ください。


故に上記のコードのようにRight関数を用いる場合は、
「ファイル名全体の文字数 - 拡張子の文字数」を計算する必要があります。

対してMid関数なら「"."が見つかった位置の次の文字から最後まで」を取れるので、
コードとしてはこちらが簡単になります。


右側を取ってくると聞くとRight関数を使いたくなりますが、
Instr系と相性が良いのはMid関数の方ですので知っておきましょう。


といいつつ、今回はGetExtensionNameメソッドがありますので、
わざわざこちらの方法を使用することは滅多にないかもしれません。

Macパソコンで実行するためFileSystemObjectが使えない時などは、
こちらの方法で代替してください。