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 スプレッドシートにエクスポート
結論として、ファイル名にピリオドが含まれる可能性も考慮すると、InStrRev
とLeft
を組み合わせる方法がより安全で推奨されます。 用途に応じて最適な方法を選択してください。