銀河鉄道

【VBA】文字列から拡張子を取得して、文字列として返す|InStrRev

サムネイル
文字列から拡張子を取得する

文字列の中の拡張子を、文字列で返す

' 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

| 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

同じ処理をPythonでも書いてみよう

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧