ファイル名から拡張子を取り出す方法を解説します。
FileSystemObjectのGetExtensionNameメソッドを利用する方法と、
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が使えない時などは、
こちらの方法で代替してください。