wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA InStrRevでフルパスからファイル名を完璧抽出!インフラ業務の自動化を加速

VBA InStrRevでフルパスからファイル名を完璧抽出!インフラ業務の自動化を加速

インフラ担当者の皆さん、日々大量のファイルやディレクトリの管理に追われ、「このフルパスリストから、ファイル名だけをサッと抽出できたら…」と頭を抱えることはありませんか? 手作業でのコピー&ペーストは時間がかかるだけでなく、ヒューマンエラーのリスクも伴います。特に、監視ログの解析やシステム構成管理で、何百、何千というパスから必要な情報だけを切り出す作業は骨が折れますよね。

この記事では、VBAの強力な文字列関数InStrRevを使って、どんなフルパスからでも効率的かつ正確にファイル名を抽出する方法を解説します。コピペで即座に使える実務コードと、見落としがちな「パス区切り文字」の罠を回避するテクニックまで、VBAエキスパートが徹底的に解説します。あなたのインフラ業務の自動化と効率化を、今日から加速させましょう!

【実務コード】コピペで動く!フルパスからファイル名抽出VBA

まずは、Windowsの一般的なファイルパスからファイル名を抽出する基本的なコードです。これをVBAモジュールに貼り付けて、すぐに試してみてください。

Sub ExtractFileNameFromFullPath_Basic()
    Dim fullPath As String
    Dim lastSeparatorPos As Long ' 最後のパス区切り文字の位置
    Dim fileName As String

    ' --- 例1: Windowsローカルファイルパス ---
    fullPath = "C:\Data\Logs\ApplicationLog_20231027.txt"

    ' InStrRev関数で、文字列を逆方向(右から左)に検索し、
    ' 最後の「\」(バックスラッシュ)の位置を見つける
    lastSeparatorPos = InStrRev(fullPath, "\")

    If lastSeparatorPos > 0 Then
        ' 最後の「\」の次の文字から末尾までをファイル名として抽出
        fileName = Mid(fullPath, lastSeparatorPos + 1)
    Else
        ' パス区切り文字が見つからない場合(例: "MyFile.txt")、
        ' フルパス自体がファイル名とみなされる
        fileName = fullPath
    End If

    Debug.Print "フルパス: " & fullPath
    Debug.Print "抽出ファイル名: " & fileName
    ' 期待される出力: 抽出ファイル名: ApplicationLog_20231027.txt

    ' --- 例2: ルートディレクトリのファイル ---
    fullPath = "D:\README.md"
    lastSeparatorPos = InStrRev(fullPath, "\")
    If lastSeparatorPos > 0 Then
        fileName = Mid(fullPath, lastSeparatorPos + 1)
    Else
        fileName = fullPath
    End If
    Debug.Print "フルパス: " & fullPath
    Debug.Print "抽出ファイル名: " & fileName
    ' 期待される出力: 抽出ファイル名: README.md

    ' --- 例3: 区切り文字がない場合 ---
    fullPath = "MyDocument.docx"
    lastSeparatorPos = InStrRev(fullPath, "\")
    If lastSeparatorPos > 0 Then
        fileName = Mid(fullPath, lastSeparatorPos + 1)
    Else
        fileName = fullPath
    End If
    Debug.Print "フルパス: " & fullPath
    Debug.Print "抽出ファイル名: " & fileName
    ' 期待される出力: 抽出ファイル名: MyDocument.docx

End Sub

【重要解説】パス区切り文字の落とし穴を回避する!

上記のコードはWindowsのローカルファイルパス(C:\Data\Log.txt)を想定しているため、パス区切り文字として「\」(バックスラッシュ)を検索しています。しかし、ここには大きな落とし穴があります。

⚠ 注意: パス区切り文字の罠!

VBAでファイルパスを扱う際、最も注意すべき点が「パス区切り文字」の種類です。

  • Windowsのローカルファイルパス: 通常 \ (バックスラッシュ) を使用します。例: C:\Folder\File.txt
  • WebのURL、ネットワーク上の共有パス、一部のシステム (Linux/macOS形式など): 通常 / (スラッシュ) を使用します。例: https://example.com/path/to/file.pdf, //Server/Share/Folder/File.log

もし処理したいパスに"/"(スラッシュ)が含まれる可能性がある場合、上記のInStrRev(fullPath, "\")では意図した結果が得られません。

解決策: どちらの区切り文字にも対応する

より堅牢なファイル名抽出のためには、\/ の両方を考慮する必要があります。いくつかアプローチがありますが、最もシンプルで確実なのは、両方の区切り文字で検索し、より末尾に近い位置を採用する方法です。


' フルパスからファイル名を安全に抽出する関数
Function GetFileNameFromFullPathSafe(ByVal fullPath As String) As String
    Dim lastBackslashPos As Long  ' "\" の位置
    Dim lastSlashPos As Long      ' "/" の位置
    Dim lastSeparatorPos As Long  ' 最終的に採用する区切り文字の位置

    ' まず、それぞれの区切り文字の最終出現位置をInStrRevで取得
    lastBackslashPos = InStrRev(fullPath, "\")
    lastSlashPos = InStrRev(fullPath, "/")

    ' どちらがより末尾に近いか(大きい数値か)を判断
    ' VBA.Math.Max は Excel VBA では使えますが、純粋なVB6/VBAでは使えない場合があります。
    ' その場合は、If文で比較してください。
    If lastBackslashPos > lastSlashPos Then
        lastSeparatorPos = lastBackslashPos
    Else
        lastSeparatorPos = lastSlashPos
    End If
    ' または、より短く記述: lastSeparatorPos = WorksheetFunction.Max(lastBackslashPos, lastSlashPos)
    ' WorksheetFunctionを使う場合はExcelが起動している必要があります。

    If lastSeparatorPos > 0 Then
        ' 最終的に採用した区切り文字の次から末尾までをファイル名として抽出
        GetFileNameFromFullPathSafe = Mid(fullPath, lastSeparatorPos + 1)
    Else
        ' どちらの区切り文字も見つからなかった場合、フルパス自体がファイル名
        GetFileNameFromFullPathSafe = fullPath
    End If
End Function

' --- 使用例 ---
Sub TestGetFileNameFromFullPathSafe()
    Debug.Print "--- 安全なファイル名抽出テスト ---"
    Debug.Print "Windowsパス: " & GetFileNameFromFullPathSafe("C:\Users\Admin\Documents\report.xlsx")
    ' 期待される出力: report.xlsx

    Debug.Print "Web URL: " & GetFileNameFromFullPathSafe("https://www.example.com/downloads/setup.exe")
    ' 期待される出力: setup.exe

    Debug.Print "混合パス (推奨されませんが、対応): " & GetFileNameFromFullPathSafe("Folder/SubFolder\Image.jpg")
    ' 期待される出力: Image.jpg

    Debug.Print "ファイル名のみ: " & GetFileNameFromFullPathSafe("MyPicture.png")
    ' 期待される出力: MyPicture.png

    Debug.Print "ルートディレクトリファイル (Windows): " & GetFileNameFromFullPathSafe("C:\boot.ini")
    ' 期待される出力: boot.ini

    Debug.Print "ルートディレクトリファイル (Linux/Web風): " & GetFileNameFromFullPathSafe("/var/log/syslog")
    ' 期待される出力: syslog
End Sub

まとめ

VBAのInStrRev関数は、フルパスからファイル名を抽出する際に非常に強力なツールです。右端からの検索という特性が、ファイル名の特定を容易にします。

しかし、インフラの現場では様々な形式のパスが混在するため、Windowsの\だけでなく、Webや一部システムで使われる/にも対応できる汎用的なコードを用意しておくことが重要です。今回紹介した安全な抽出関数GetFileNameFromFullPathSafeを活用すれば、どんなパス形式にも柔軟に対応し、あなたのVBAスクリプトの信頼性と堅牢性を大幅に向上させることができます。

これらのテクニックを駆使して、日々のルーティンワークを自動化し、より戦略的な業務に時間を使えるようになりましょう。VBAは、インフラエンジニアの強力な味方です!

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら