【Excel VBA】拡張子を除いたファイル名のみを取得する2つの方法 (Split / InStrRev)

VBAでファイル名を扱う際、「Report.xlsx」というフルネームから拡張子.xlsxを取り除き、「Report」というベース名だけを取得したい、という場面は頻繁に発生します。例えば、同じ名前で新しいフォルダを作成したり、テキストファイルを出力したりする場合です。

VBAには、この処理を一行で実現するスマートな方法と、より確実に処理を行う堅牢な方法の、主に2つのアプローチがあります。この記事では、それぞれの方法を詳しく解説します。


目次

方法1:Split関数を使う方法(推奨)

Split関数は、指定した区切り文字で文字列を分割し、配列を作成する関数です。ファイル名と拡張子はピリオド(.)で区切られているため、これを利用するのが最もシンプルで直感的な方法です。

コードと解説

Sub GetBaseName_WithSplit()

    ' 変数を宣言します
    Dim fullFileName As String
    Dim baseFileName As String
    
    ' 現在アクティブなブックの名前を取得
    fullFileName = ActiveWorkbook.Name
    
    ' Split関数でピリオドを区切り文字として文字列を配列に分割し、
    ' その最初の要素(インデックス番号0)を取得します。
    baseFileName = Split(fullFileName, ".")(0)
    
    ' 結果を表示
    MsgBox "拡張子を除いたファイル名: " & baseFileName

End Sub

Split(fullFileName, ".")は、例えば"Report.xlsx"という文字列を "." で分割し、("Report", "xlsx") という2つの要素を持つ配列を作成します。配列のインデックスは0から始まるため、その最初の要素である(0)を指定することで、拡張子の前の部分「Report」を取得できます。

✓ 注意点: この方法は、My.Report.2025.xlsxのようにファイル名自体にピリオドが含まれている場合、最初のピリオドまでしか取得できず、「My」という結果になってしまいます。


方法2:InStrRev関数とLeft関数を組み合わせる方法

こちらは、文字列の右側からピリオドの位置を検索するInStrRev関数と、左側から文字列を抽出するLeft関数を組み合わせる、より堅牢な方法です。

コードと解説

Sub GetBaseName_WithInStrRev()

    ' 変数を宣言します
    Dim fullFileName As String
    Dim baseFileName As String
    Dim periodPosition As Long
    
    ' 現在アクティブなブックの名前を取得
    fullFileName = ActiveWorkbook.Name
    
    ' InStrRev関数で、文字列の「末尾から」ピリオドの位置を検索
    periodPosition = InStrRev(fullFileName, ".")
    
    ' ピリオドが見つかった場合のみ処理
    If periodPosition > 0 Then
        ' Left関数で、ピリオドの直前までの文字列を抽出
        baseFileName = Left(fullFileName, periodPosition - 1)
    Else
        ' ピリオドが見つからなかった場合(拡張子がないファイル名など)は、元の名前をそのまま使う
        baseFileName = fullFileName
    End If

    ' 結果を表示
    MsgBox "拡張子を除いたファイル名: " & baseFileName
    
End Sub
  • InStrRev(fullFileName, "."): 文字列の右側から検索を開始し、最初に見つかったピリオドの位置を返します。これにより、ファイル名に複数のピリオドがあっても、必ず拡張子の直前のピリオドの位置を取得できます。
  • Left(fullFileName, periodPosition - 1): 見つかったピリオドの位置から1を引いた文字数分を、文字列の左側から抽出します。これにより、ピリオド自体を含まないファイル名部分だけを取り出せます。

この方法は、My.Report.2025.xlsxのようなファイル名に対しても、「My.Report.2025」という正しい結果を返します。


まとめ

拡張子を除いたファイル名を取得する2つの方法には、それぞれ特徴があります。

方法特徴長所注意点
Split簡潔でモダンコードが1行で短く、直感的で分かりやすい。ファイル名自体にピリオドが含まれると期待通りに動作しない。
InStrRev + Left堅牢で確実最後のピリオドを基準にするため、どんなファイル名でもほぼ確実に動作する。コードが少し長くなる。

Google スプレッドシートにエクスポート

結論として、ファイル名にピリオドが含まれる可能性も考慮すると、InStrRevLeftを組み合わせる方法がより安全で推奨されます。 用途に応じて最適な方法を選択してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次