【Excel VBA】ファイル名・ファイルパスを取得する方法!拡張子無し版も!

Excel VBAでフォルダ内のファイル名やファイルパスを取得したいときはないでしょうか。

けど、そんな中で悩むことは、

・Excel VBAでフォルダ内のファイル名やファイルパスを取得するやり方がわからない。
・拡張子を取り除くなど出力したファイル名を加工したいがやり方がわからない。

ですよね。

今回はそんなお悩みを解決する

・Excel VBAでフォルダ内のファイル名やファイルパスを取得する方法
・Excel VBAでフォルダ内のファイル名やファイルパスを取得し拡張子部分を削除する方法

についてまとめます!

Excel VBAでフォルダ内のファイル名やファイルパスを取得する完成イメージ

Excel VBAでフォルダ内のファイル名やファイルパスを取得する完成イメージについて説明します。

まず、ファイル一覧を取得したいフォルダへアクセスし、パス情報を取得します。

Excelにシートを追加し、B1セルへそのパスを貼り付けます。

VBAを実行すると、黄色い背景の箇所にファイル名と、そのファイルパスが出力されます。

このような形になります。

タカヒロ
タカヒロ
今回は指定パスの一階層目のみが対象となります。2階層目以降のサブフォルダを含ませたい場合は以下をご参照ください。

【Excel VBA】サブフォルダを含むファイル名・パスを取得する方法!拡張子削除も対応!

さらに拡張子を除く処理を加え、ファイルの拡張子を除いたファイル名一覧を出力していきます。

それではさっそくやってみましょう。

フォルダ内のファイル名やファイルパスを取得するVBA

フォルダ内のファイル名やファイルパスを取得するVBAを実装していきましょう。

以下サンプルコードです。

Sub フォルダ内のファイル名やファイルパスを取得()

Dim intIchi As Integer
Dim strFolderpass As String
Dim objfFSO As Object
Dim objFiles As Object
Dim objFile As Object


'ファイル名一覧を出力する行番号を指定します。
intIchi = 3

'対象フォルダのファイルパスがあるセルを指定し、値を代入します。
strFolderpass = Range("B1").Value

'指定範囲の値をクリアします。
Range("A3:B10000").Clear


'対象フォルダのファイルパスの値があれば処理をおこないます。
If strFolderpass = "" Then
    MsgBox "対象フォルダのファイルパスがありません。ファイルパスを入力してください。"
Else

    'FileSystemObjectはファイルやフォルダを操作する専用のオブジェクトです。インスタンスにセットします。
    Set objfFSO = CreateObject("Scripting.FileSystemObject")

    '対象フォルダのファイルオブジェクトをセットします。
    Set objFiles = objfFSO.GetFolder(strFolderpass).Files
    
    'ファイル情報を出力します。
    For Each objFile In objFiles
        Cells(intIchi, 1) = objFile.Name        
        Cells(intIchi, 2) = objFile.Path
        intIchi = intIchi + 1
    Next objFile

End If

Set objfFSO = Nothing
Set objFiles = Nothing
Set objFile = Nothing

End Sub

VBAの設定

以下の設定をおこないます。

ファイル名一覧を出力する行番号を指定します。サンプルではA3から出力していますので3行目の3を入れています。

対象フォルダのファイルパスがあるセルを指定します。上記の通りB1セルを指定します。
指定範囲の値をクリアします。これは再実行時に前の出力値を残さないようにするためにする設定です。
1万行以上ある場合は数値の部分を変更してください。

Range(“A3:B10000”).Clear

では実行してみましょう。

はい、指定フォルダの一階層目のファイル名とファイルパスが取得できていますね。

VBAの説明

ファイル名を取得しているのはFileSystemObjectで、
ファイルやフォルダを操作したり、情報を取得するオブジェクトとなり、
このFileSystemObjectオブジェクトをインスタンスにセットします。

Set objfFSO = CreateObject("Scripting.FileSystemObject")

タカヒロ
タカヒロ
この箇所でエラーとなった場合は、VBEを開き、ツール>参照設定へアクセスし、
「Microsoft Scripting Runtime」にチェックを入れてください。

Filesプロパティ対象フォルダのファイルオブジェクトをセットします。

Set objFiles = objfFSO.GetFolder(strFolderpass).Files

ファイルオブジェクトから一件づつファイル情報を出力します。
Nameプロパティでファイル名をPathプロパティでディレクトリ情報を取得し、セルへ代入しています。

For Each objFile In objFiles
Cells(intIchi, 1) = objFile.Name
Cells(intIchi, 2) = objFile.Path
intIchi = intIchi + 1
Next objFile

フォルダ内のファイル名やファイルパスを取得し拡張子部分を削除するVBA

次に取得したファイル名一覧からドット「.」以下の拡張子を取り除いていきましょう。

以下サンプルコードです。

Sub フォルダ内のファイル名やファイルパスを取得_拡張子部分を削除()

Dim intIchi As Integer
Dim strFolderpass As String
Dim objfFSO As Object
Dim objFiles As Object
Dim objFile As Object


'ファイル名一覧を出力する行番号を指定します。
intIchi = 3

'対象フォルダのファイルパスがあるセルを指定し、値を代入します。
strFolderpass = Range("B1").Value

'指定範囲の値をクリアします。
Range("A3:B10000").Clear


'対象フォルダのファイルパスの値があれば処理をおこないます。
If strFolderpass = "" Then
    MsgBox "対象フォルダのファイルパスがありません。ファイルパスを入力してください。"
Else

    'FileSystemObjectはファイルやフォルダを操作する専用のオブジェクトです。インスタンスにセットします。
    Set objfFSO = CreateObject("Scripting.FileSystemObject")

    '対象フォルダのファイルオブジェクトをセットします。
    Set objFiles = objfFSO.GetFolder(strFolderpass).Files
    
    'ファイル情報を出力します。
    For Each objFile In objFiles
        Cells(intIchi, 1) = objFile.Name
        
        '拡張子を削除したファイル名を出力します。
        If InStrRev(objFile.Name, ".") Then
            'InStrRevで右から"."の位置を取得し、それ以降の文字列を抽出します。
            Cells(intIchi, 1) = Left(objFile.Name, InStrRev(objFile.Name, ".") - 1)
        End If
        
        Cells(intIchi, 2) = objFile.Path
        intIchi = intIchi + 1
    Next objFile

End If

Set objfFSO = Nothing
Set objFiles = Nothing
Set objFile = Nothing

End Sub

VBAの説明

設定内容は先ほどのVBAと同じで、拡張子を取り除く処理だけを追加しています。

拡張子を削除したファイル名を出力します。
InStrRev関数で右から指定ワードに合致した位置を取得し、Left関数でそれ以降の文字を抽出していきます。

If InStrRev(objFile.Name, ".") Then
Cells(intIchi, 1) = Left(objFile.Name, InStrRev(objFile.Name, ".") - 1)
End If

タカヒロ
タカヒロ
Inster関数だと左から指定ワードを探しに行きますので、例えば「test1.2021.8.xls」だと「test1.2021.8」とはならずに「test1」となってしまいます。
拡張子など右の文字から判定する場合は、InStrRev関数を追加しましょう。


では実行してみましょう。

はい、指定フォルダの一階層目のファイル名とファイルパスが拡張子を取り除いた形で取得されていますね。

<追加>拡張子「.pdf」だけのファイルを抜き出す方法

利用者様より質問あり、拡張子「.pdf」だけのファイルを抜き出す方法について追加します。

サンプルコード

サンプルコードは以下となります。

Sub フォルダ内のPDFファイル名やファイルパスを取得()

    Dim intIchi As Integer
    Dim strFolderpass As String
    Dim objfFSO As Object
    Dim objFiles As Object
    Dim objFile As Object
    
    
    'ファイル名一覧を出力する行番号を指定します。
    intIchi = 3
    
    '対象フォルダのファイルパスがあるセルを指定し、値を代入します。
    strFolderpass = Range("B1").Value
    
    '指定範囲の値をクリアします。
    Range("A3:B10000").Clear
    
    
    '対象フォルダのファイルパスの値があれば処理をおこないます。
    If strFolderpass = "" Then
        MsgBox "対象フォルダのファイルパスがありません。ファイルパスを入力してください。"
    Else
    
        'FileSystemObjectはファイルやフォルダを操作する専用のオブジェクトです。インスタンスにセットします。
        Set objfFSO = CreateObject("Scripting.FileSystemObject")
    
        '対象フォルダのファイルオブジェクトをセットします。
        Set objFiles = objfFSO.GetFolder(strFolderpass).Files
        
        'PDFファイル情報を出力します。
        For Each objFile In objFiles
            ' ファイルの拡張子が.pdfの場合のみ処理を行います
            If LCase(objfFSO.GetExtensionName(objFile.Name)) = "pdf" Then
                Cells(intIchi, 1) = objFile.Name
                Cells(intIchi, 2) = objFile.Path
                intIchi = intIchi + 1
            End If
        Next objFile
    
    End If
    
    Set objfFSO = Nothing
    Set objFiles = Nothing
    Set objFile = Nothing

End Sub

PDFファイルを用意する

続いて、PDFファイルと、それ以外の種類のファイルを用意します。

タカヒロ
タカヒロ
検証のため拡張子は大文字版と小文字版種類用意しました。

VBAを実装する

「VBAの実装手順」を参考にコードをVBEに実装し、
また、実行に便利なボタンを設け、追加したマクロを登録しましょう。

VBAを実行する

まずはこれまでの全ファイル名を取得する処理を実行します。

はい、格納分のファイル名一覧が取得できました。

次に、追加実装したPDFファイルのみに絞り込むVBAを実行します。

はい!PDFファイルのみに絞り込むことができましたね!


タカヒロ
タカヒロ
大文字、小文字のPDFファイルすべて拾っていることが確認できますね。

VBAの説明

PDFのみに絞り込む判定を追加しています。

If LCase(objfFSO.GetExtensionName(objFile.Name)) = "pdf" Then

objFile は For Each ループで繰り返し参照される各ファイルを表します。
.Name はそのファイルの名前(拡張子を含む)を取得します。

GetExtensionName メソッドは引数として与えられたファイル名の拡張子部分のみを抽出します。

LCase 関数は与えられた文字列を全て小文字に変換し拡張子が大文字、小文字、またはその組み合わせで書かれていても、一貫した形式(この場合は小文字)で処理できるようになります。

タカヒロ
タカヒロ
拡張子は大文字、小文字が混在するケースが多いので、LCase 関数で統一するようにしました。

VBAの実装手順

実装手順は以下の通りです。

今回はExcel側にこのVBAを実装します。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。

さいごに

いかがでしょうか。

今回は、

・Excel VBAでフォルダ内のファイル名やファイルパスを取得する方法
・Excel VBAでフォルダ内のファイル名やファイルパスを取得し拡張子部分を削除する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








6 件のコメント

  • お世話様です。

    対象フォルダーの中に、csvやxlsx等複数入っている場合、「pdf」だけを取り出したい場合は、どのような構文を追加すればいいのでしょうか。
    宜しくお願いします。

  • マクロ初心者のため、基本的な質問で申し訳ありません。

    なぜ、「フォルダ1-1」「フォルダ1-2」のパスは取得されないのでしょうか?

    • いつもご利用ありがとうございます。

      フォルダのパスが入っていない件につきまして、
      このVBAは特定フォルダにあるファイル名一覧がほしいという要望から設計しましたので、
      仕様としてフォルダを対象にしていなかったということが理由となります。

      なお、のちにサブフォルダも対象にしてほしい要望がありまして、
      この機能拡張版を別記事にて公開をしていますので、
      よろしければこちらもご参考ください。
      https://extan.jp/?p=5057

    • 大変失礼いたしました。
      「変数が定義されていません」となる件につきまして、
      コード中の変数のうちDim宣言がされていないものが含まれることが原因となります。
      コードを修正いたしましたので再度確認いただきたくお願いいたします。

      またVBEのコード入力エリアに「Option Explicit」が入っているかと思いますが、
      そちらを削除すれば変数の宣言強制状態を解除することができます。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です