【VBA】文字列から拡張子を取得して、文字列として返す|InStrRev
作成日:2022-11-01
更新日:2025-10-05

文字列の中の拡張子を、文字列で返す
' Returns the file extension (e.g., ".xlsx") from a file path.
' 文字列から拡張子(例 ".xlsx")を返す。
' 拡張子がない場合は空文字を返す。
' -----------------------------------------------------------------------
Public Function GetExtension(ByVal targetString As String) As String
Dim pos As Long
'最後のドット位置を取得(FromEnd=True で後方検索)
pos = InStrRev(targetString, ".")
If pos = 0 Or pos = Len(targetString) Then
'拡張子が見つからない・末尾が「.」の場合は空を返す
GetExtension = ""
Exit Function
End If
'拡張子を返す
GetExtension = Mid$(targetString, pos)
End Function使用例
Debug.Print GetExtension("C:\data\sales.xlsx") ' → .xlsx
Debug.Print GetExtension("report.txt") ' → .txt
Debug.Print GetExtension("noext") ' → ""
Debug.Print GetExtension("C:\tmp\abc.") ' → ""

文字列の、「.」以降の文字を返す
関数Memo
InStrRev|後方検索
- 「拡張子」は最後のドットを探す方が正確
InStrRev(str, ".")は後ろから検索する標準関数
エラーは出さない
- エラーは呼び出し側が制御する
- 関数側は戻り値で異常を伝える方が汎用的
空や末尾ドットも考慮
"C:\temp\file."のようなケースもある- 空を返すようにする
Mid$
MidよりMid$の方が速い($付きは文字列専用でメモリ効率が良い)。

ちなみに、FSOを使う方法もある
InStrRev + Mid$ か/FSO(FileSystemObject)か
何を基準に選ぶ?|Decision Criteria
一番おすすめ|
InStrRev + Mid$(標準関数)依存が増えず速くて安定、戻り値の設計も自由度高い
ループ大量処理にも強い
FSOを使う場合の注意点
- FSOはCOM依存
- COM生成コストがある → 大量だと遅延
- (ただし、遅延が気になるのは数千回・数万回の呼び出しの場合)
- 既にFSOを使う文脈なら一緒に使える
- 意図を明示したい時に有効(読みやすさ/一貫性)
- 戻り値:ドットなし(例「
xlsx」)。必要なら呼び出し側で.を付与。
Choose intent over habit: pick FSO when you already use it, pick intrinsics when you don’t
“使ってる文脈”で選ぶ—FSOはFSO文脈で、そうでなければ標準関数で
- この関数だけのためにFSOを導入しない(依存最小/速度重視)。
- 既にFSOを使うユーティリティ群が中心→FSO版で統一して意図を揃えるのは○。
- 拡張子の表示仕様が「ドット付き」で欲しい → 標準関数版が自然。
- ループで数万件処理 → 標準関数版 or FSOシングルトン化。

FSOはシングルトンで使おう
Referenced Insights & Citations
- Microsoft Learn. (n.d.). FileSystemObject.GetExtensionName method (VB). https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/windows-scripting/x23stk5t(v=vs.84)
- Microsoft Learn. (n.d.). InStrRev function (VBA). https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/instrrev-function
- Microsoft Learn. (n.d.). Mid function (VBA). https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/mid-function
| InStrRev|後方検索 |
| Mid$ Function|Mid$関数 |
| File Extension|ファイル拡張子 |
| Error Handling|エラーハンドリング |
| Safe Function Design|安全な関数設計 |
| Intrinsic Functions|標準関数 |
| FileSystemObject|ファイルシステムオブジェクト |
| Dependency Footprint|依存性のフットプリント |
| Singleton Pattern|シングルトンパターン |
| COM Overhead|COMオーバーヘッド |
| Expressiveness|可読性(意図の明確さ) |
| Return Shape|返り値の仕様 |
| Performance in Loops|ループ時の性能 |
Prefer intrinsics for speed
and minimal dependencies
and minimal dependencies

同じ処理をPythonでも書いてみよう
2022-11-01
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-

[VBA]Control the calculation再計算 【VBA】指定のシートを再計算する|Calculate -

[VBA]Make Directory MkDir 【VBA】フォルダを作る|MkDir(フォルダがすでに存在していればエラーになる) -

[VBA]CSVに書き出す 【VBA】CSVに配列の中身を書き出す|ADODB.Stream -

[VBA]開いているブックからファイルを探す 【VBA】開いている全ブックから対象ブックをセット|InStr ファイル名の一部で判定 -

[VBA]fsoSingleton pattern 【VBA】FSO(“Scripting.FileSystemObject”)|シングルトン化して使う -

ボタンをリボンに設置 【VBA】ボタンをリボンに設定する