Excel VBAでフォルダ内のファイル名やファイルパスを取得したいときはないでしょうか。
けど、そんな中で悩むことは、
・拡張子を取り除くなど出力したファイル名を加工したいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
・Excel VBAでフォルダ内のファイル名やファイルパスを取得し拡張子部分を削除する方法
についてまとめます!
もくじ
Excel VBAでフォルダ内のファイル名やファイルパスを取得する完成イメージ
Excel VBAでフォルダ内のファイル名やファイルパスを取得する完成イメージについて説明します。
まず、ファイル一覧を取得したいフォルダへアクセスし、パス情報を取得します。
Excelにシートを追加し、B1セルへそのパスを貼り付けます。
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万行以上ある場合は数値の部分を変更してください。
では実行してみましょう。
はい、指定フォルダの一階層目のファイル名とファイルパスが取得できていますね。
VBAの説明
ファイル名を取得しているのはFileSystemObjectで、
ファイルやフォルダを操作したり、情報を取得するオブジェクトとなり、
このFileSystemObjectオブジェクトをインスタンスにセットします。
Set objfFSO = CreateObject("Scripting.FileSystemObject")
「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
拡張子など右の文字から判定する場合は、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ファイルのみに絞り込むことができましたね!
VBAの説明
PDFのみに絞り込む判定を追加しています。
If LCase(objfFSO.GetExtensionName(objFile.Name)) = "pdf" Then
objFile は For Each ループで繰り返し参照される各ファイルを表します。
.Name はそのファイルの名前(拡張子を含む)を取得します。
GetExtensionName メソッドは引数として与えられたファイル名の拡張子部分のみを抽出します。
LCase 関数は与えられた文字列を全て小文字に変換し拡張子が大文字、小文字、またはその組み合わせで書かれていても、一貫した形式(この場合は小文字)で処理できるようになります。
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
さいごに
いかがでしょうか。
今回は、
・Excel VBAでフォルダ内のファイル名やファイルパスを取得し拡張子部分を削除する方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
お世話様です。
対象フォルダーの中に、csvやxlsx等複数入っている場合、「pdf」だけを取り出したい場合は、どのような構文を追加すればいいのでしょうか。
宜しくお願いします。
いつもご利用ありがとうございます。
ファイル種混在のフォルダから「pdf」だけを取り出す処理について記事に追加しましたので、
よろしければご参照ください。
https://extan.jp/?p=5023#%EF%BC%9C%E8%BF%BD%E5%8A%A0%EF%BC%9E%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%80%8Cpdf%E3%80%8D%E3%81%A0%E3%81%91%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8A%9C%E3%81%8D%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95
マクロ初心者のため、基本的な質問で申し訳ありません。
なぜ、「フォルダ1-1」「フォルダ1-2」のパスは取得されないのでしょうか?
いつもご利用ありがとうございます。
フォルダのパスが入っていない件につきまして、
このVBAは特定フォルダにあるファイル名一覧がほしいという要望から設計しましたので、
仕様としてフォルダを対象にしていなかったということが理由となります。
なお、のちにサブフォルダも対象にしてほしい要望がありまして、
この機能拡張版を別記事にて公開をしていますので、
よろしければこちらもご参考ください。
https://extan.jp/?p=5057
objfiles
変数が定義されていません
と出てしまいます。
どうしたらよいでしょうか?
大変失礼いたしました。
「変数が定義されていません」となる件につきまして、
コード中の変数のうちDim宣言がされていないものが含まれることが原因となります。
コードを修正いたしましたので再度確認いただきたくお願いいたします。
またVBEのコード入力エリアに「Option Explicit」が入っているかと思いますが、
そちらを削除すれば変数の宣言強制状態を解除することができます。