課題・悩み「フォルダ内のファイル名の一覧を取得したい」
解決策「特定のフォルダ内のファイルの名前と拡張子を一括取得するVBAマクロ」を解説
この記事では、Excel VBAを使って指定したフォルダ内のファイル名をExcelシートにリストアップする方法を解説します。
さらに、ファイル名から拡張子を取り除く方法についても紹介します。
【特定のフォルダ内のファイルの名前と拡張子を一括取得するVBAマクロ】を図解で解説しています。
VBAマクロファイルを配布中。
以下のボタンよりダウンロードしてください。
ファイル名のみ
このVBAマクロは、ユーザーが選択したフォルダ内のファイル名をExcelシートにリストアップします。
ただし、出力するのは拡張子を除いたファイル名です。
具体的には、ユーザーがフォルダを選択すると、そのフォルダ内の全てのファイルの名前が拡張子を除いた状態でExcelシートの指定されたセルに一覧表示されます。
Option Explicit
Sub ダイアログでファイル名をリストアップ()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim folderPath As String ' folderPath変数の宣言を追加
    ' フォルダ選択ダイアログを表示
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択してください"
        .AllowMultiSelect = False
        If .Show <> -1 Then Exit Sub ' ユーザーがキャンセルした場合、処理を中断
        folderPath = .SelectedItems(1)
    End With
    ws.Range("A1").Value = folderPath ' 選択したフォルダパスをA1に出力
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    Dim fileName As String
    fileName = Dir(folderPath)
    Dim outputRow As Integer
    outputRow = 6 ' B6セルから出力開始
    Do While fileName <> ""
        Dim fileNameWithoutExtension As String
        fileNameWithoutExtension = Left(fileName, InStrRev(fileName, ".") - 1)
        ws.Cells(outputRow, 2).Value = fileNameWithoutExtension ' B列に拡張子なしのファイル名を出力
        outputRow = outputRow + 1
        fileName = Dir() ' 次のファイル名を取得
    Loop
End Subマクロの全体像
このマクロは、以下の手順でフォルダ内のファイル名をリストアップします:
1. ユーザーがフォルダを選択
2. 選択したフォルダ内のファイル名を取得
3. ファイル名から拡張子を除去
4. Excelシートにファイル名を出力
処理ごとの解説
以下の表で、各処理の概要、詳細な解説、対象となるコードを示します。
シートの設定
処理対象のシートを指定します。
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")フォルダパスの変数を宣言
フォルダのパスを保存するための変数を宣言します。
Dim folderPath As Stringフォルダ選択ダイアログの表示
ユーザーにフォルダ選択ダイアログを表示し、選択されたフォルダパスを取得します。
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "フォルダを選択してください"
    .AllowMultiSelect = False
    If .Show <> -1 Then Exit Sub
    folderPath = .SelectedItems(1)
End Withフォルダパスの出力
選択したフォルダのパスをExcelシートのセルA1に出力します。
ws.Range("A1").Value = folderPathフォルダパスの調整
フォルダパスの末尾にバックスラッシュがない場合、追加します。
If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"ファイル名の取得
フォルダ内の最初のファイル名を取得します。
Dim fileName As String
fileName = Dir(folderPath)出力開始行の設定
ファイル名を出力する開始行を設定します。
Dim outputRow As Integer
outputRow = 6ファイル名のループ処理
フォルダ内の全てのファイル名を取得し、拡張子を除いた名前をシートに出力します。
Do While fileName <> ""
    Dim fileNameWithoutExtension As String
    fileNameWithoutExtension = Left(fileName, InStrRev(fileName, ".") - 1)
    ws.Cells(outputRow, 2).Value = fileNameWithoutExtension
    outputRow = outputRow + 1
    fileName = Dir()
Loop必要な環境設定
VBAの有効化
このマクロを実行するには、ExcelでVBAが有効になっている必要があります。
これは通常、Excelのオプションから「開発」タブを表示し、マクロ設定を「全てのマクロを有効にする」に設定することで行います。
信頼された場所
マクロを含むファイルを安全な場所に保存し、「信頼された場所」として設定することをお勧めします。
これにより、マクロが安全に実行されます。
注意点
大量のファイルが含まれるフォルダを選択すると、処理に時間がかかることがあります。
VBAマクロで実行した操作は元に戻せないため、事前にデータのバックアップを取ることをお勧めします。
このマクロを実行するためには、ExcelのVBA機能が有効になっている必要があります。
コードの変更箇所
もちろんです。
上記のコードを自分の環境で利用する際に変更が必要な箇所は、主にシートの名前と出力開始位置です。
以下の表で、それぞれの変更点の概要、解説、およびコードを示します。
シートの名前
自分の環境で処理を行うシートの名前に変更する必要があります。
コードでは “Sheet1” と指定されていますが、これを使用するシートの名前に変更します。
Set ws = ThisWorkbook.Sheets("YourSheetName")出力開始位置
ファイル名を出力する開始セルの位置を変更する必要がある場合、outputRowの初期値を変更します。
デフォルトでは6行目に設定されていますが、これを適切な行番号に変更します。
outputRow = YourStartファイル名と拡張子別
Option Explicit
Sub ListFiles()
    Dim fldr As FileDialog
    Dim folderPath As String
    Dim folder As Object
    Dim file As Object
    Dim i As Long
    Dim fileName As String
    Dim fileExtension As String
    ' フォルダ選択ダイアログを表示
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    fldr.Title = "フォルダを選択してください"
    If fldr.Show <> -1 Then Exit Sub
    folderPath = fldr.SelectedItems(1)
    ' 選択したフォルダのパスをB1セルに出力
    With ThisWorkbook.Sheets("Sheet1")
        .Range("B1").Value = folderPath
    End With
    ' B6セルとC6セルを初期位置に設定
    i = 6
    With ThisWorkbook.Sheets("Sheet1")
        ' ファイル名と拡張子をクリア
        .Range("B6:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).ClearContents
        ' 選択したフォルダ内のファイルを取得
        Set folder = CreateObject("Scripting.FileSystemObject").GetFolder(folderPath)
        For Each file In folder.Files
            ' ファイル名と拡張子を分離
            fileName = Left(file.Name, InStrRev(file.Name, ".") - 1)
            fileExtension = Mid(file.Name, InStrRev(file.Name, ".") + 1)
            
            ' ファイル名をB列に、拡張子をC列に出力
            .Cells(i, 2).Value = fileName
            .Cells(i, 3).Value = fileExtension
            i = i + 1
        Next file
    End With
End SubこのVBAマクロは、ユーザーが指定したフォルダ内のすべてのファイル名とその拡張子を取得し、それらをExcelのシートに出力します。
具体的には、フォルダ選択ダイアログを表示してユーザーがフォルダを選び、そのフォルダ内のファイル名(拡張子を除く部分)をB列に、拡張子をC列に表示します。
Option Explicit
Sub ListFiles()
    Dim folderPath As String
    ' フォルダ選択ダイアログを表示
    folderPath = SelectFolder()
    If folderPath = "" Then Exit Sub
    ' 選択したフォルダのパスをB1セルに出力
    OutputFolderPath folderPath
    ' ファイル名と拡張子をシートに出力
    OutputFileNamesAndExtensions folderPath
End Sub
' フォルダ選択ダイアログを表示し、選択されたフォルダのパスを返す関数
Function SelectFolder() As String
    Dim fldr As FileDialog
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    fldr.Title = "フォルダを選択してください"
    If fldr.Show = -1 Then
        SelectFolder = fldr.SelectedItems(1)
    Else
        SelectFolder = ""
    End If
End Function
' 指定されたフォルダパスをB1セルに出力するサブルーチン
Sub OutputFolderPath(folderPath As String)
    With ThisWorkbook.Sheets("Sheet1")
        .Range("B1").Value = folderPath
    End With
End Sub
' 指定されたフォルダ内のファイル名と拡張子を取得し、シートに出力するサブルーチン
Sub OutputFileNamesAndExtensions(folderPath As String)
    Dim folder As Object
    Dim file As Object
    Dim i As Long
    Dim fileName As String
    Dim fileExtension As String
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    i = 6
    With ThisWorkbook.Sheets("Sheet1")
        ' ファイル名と拡張子をクリア
        .Range("B6:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).ClearContents
        ' ファイル名と拡張子を取得し、シートに出力
        For Each file In folder.Files
            fileName = GetFileNameWithoutExtension(file.Name)
            fileExtension = GetFileExtension(file.Name)
            .Cells(i, 2).Value = fileName
            .Cells(i, 3).Value = fileExtension
            i = i + 1
        Next file
    End With
End Sub
' ファイル名から拡張子を除いた部分を返す関数
Function GetFileNameWithoutExtension(fullName As String) As String
    GetFileNameWithoutExtension = Left(fullName, InStrRev(fullName, ".") - 1)
End Function
' ファイル名から拡張子を返す関数
Function GetFileExtension(fullName As String) As String
    GetFileExtension = Mid(fullName, InStrRev(fullName, ".") + 1)
End Function注意点
データが大量にある場合は、処理に時間がかかることがあります。
VBAマクロで実行した操作は元に戻せません。
誤操作を避けるため、実行前にExcelファイルを保存しておくことをお勧めします。
このマクロを実行するには、「Microsoft Scripting Runtime」ライブラリを参照設定する必要があります。
処理ごとの解説
1. フォルダ選択ダイアログを表示する処理
フォルダ選択
ユーザーにフォルダを選択させ、そのパスを取得します。
選択されなかった場合、処理を終了します。
vba
Function SelectFolder() As String
 Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
 fldr.Title = "フォルダを選択してください"
 If fldr.Show = -1 Then
 SelectFolder = fldr.SelectedItems(1)
 Else
 SelectFolder = ""
 End If
End Function
2. 選択されたフォルダのパスをB1セルに出力する処理
フォルダパス出力
選択されたフォルダのパスをExcelシートのB1セルに出力します。
vba
Sub OutputFolderPath(folderPath As String)
 With ThisWorkbook.Sheets("Sheet1")
 .Range("B1").Value = folderPath
 End With
End Sub
3. ファイル名と拡張子を取得し、シートに出力する処理
ファイル名と拡張子の出力
フォルダ内のファイルを取得し、ファイル名と拡張子を分離してシートに出力します。
vba
Sub OutputFileNamesAndExtensions(folderPath As String)
 Dim folder As Object
 Dim file As Object
 Dim i As Long
 Dim fileName As String
 Dim fileExtension As String
 Dim fso As Object
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set folder = fso.GetFolder(folderPath)
 i = 6
 With ThisWorkbook.Sheets("Sheet1")
 .Range("B6:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).ClearContents
 For Each file In folder.Files
 fileName = GetFileNameWithoutExtension(file.Name)
 fileExtension = GetFileExtension(file.Name)
 .Cells(i, 2).Value = fileName
 .Cells(i, 3).Value = fileExtension
 i = i + 1
 Next file
 End With
End Sub
4. ファイル名から拡張子を除いた部分を返す処理
ファイル名の取得
ファイル名から拡張子を除いた部分を返す関数です。
vba
Function GetFileNameWithoutExtension(fullName As String) As String
 GetFileNameWithoutExtension = Left(fullName, InStrRev(fullName, ".") - 1)
End Function
5. ファイル名から拡張子を返す処理
拡張子の取得
ファイル名から拡張子部分を返す関数です。
vba
Function GetFileExtension(fullName As String) As String
 GetFileExtension = Mid(fullName, InStrRev(fullName, ".") + 1)
End Function
必要な環境設定
1. 「Microsoft Scripting Runtime」ライブラリの参照設定:
VBAエディタで「ツール」→「参照設定」を開き、「Microsoft Scripting Runtime」にチェックを入れてください。
これにより、スクリプト内で FileSystemObject を使用することができます。
環境に応じて変更する箇所
以下に、自分の環境で利用する場合に変更する必要がある箇所について解説します。
1. シート名の変更
選択したフォルダパスやファイル名を出力するシートが Sheet1 ではない場合、そのシート名を変更する必要があります。
シート名
マクロが出力先として使用するシートの名前を自分の環境に合わせて変更します。
vba
With ThisWorkbook.Sheets("Sheet1") 
を 
vba
With ThisWorkbook.Sheets("YourSheetName") に変更2. 出力セルの開始位置の変更
ファイル名と拡張子の出力開始位置を変更する場合、対応する行番号や列番号を変更します。
出力セル開始位置
ファイル名と拡張子を出力する開始位置を自分の環境に合わせて変更します。
vba
i = 6 
を 
必要な行番号に変更3. クリア範囲の変更
既存のデータをクリアする範囲を変更する必要がある場合、その範囲を自分の環境に合わせて変更します。
クリア範囲
ファイル名と拡張子をクリアする範囲を自分の環境に合わせて変更します。
vba
.Range("B6:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).ClearContents 
を 
必要な範囲に変更以下に、必要に応じて変更点をまとめた表を示します。
シート名
マクロが出力先として使用するシートの名前を自分の環境に合わせて変更します。
vba
With ThisWorkbook.Sheets("Sheet1") 
を 
vba
With ThisWorkbook.Sheets("YourSheetName") に変更出力セル開始位置
ファイル名と拡張子を出力する開始位置を自分の環境に合わせて変更します。
vba
i = 6 
を 
必要な行番号に変更クリア範囲
ファイル名と拡張子をクリアする範囲を自分の環境に合わせて変更します。
vba
.Range("B6:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).ClearContents 
を 
必要な範囲に変更まとめ
この記事を参考に、自分の環境に合わせたVBAマクロを作成し、効率的にフォルダ内のファイル名をリストアップしてみてください。



コメント