このサイトはアフィリエイトリンクを含んでいます
スポンサーリンク

Excelでフォルダ内のファイル情報を一括抽出!簡単VBAマクロで業務効率アップ

Excelでフォルダ内のファイル情報を一括抽出!簡単VBAマクロで業務効率アップ 作ってみた!
スポンサーリンク
スポンサーリンク

Excelマクロを使ってフォルダ内のファイル情報を簡単に抽出する方法をご紹介します。このブログでは、初心者でも分かりやすいVBAコードとその使い方を丁寧に解説します。Excelを活用して日常の業務をもっとスマートに!ぜひ最後までお付き合いくださいね。


こんにちは、皆さん!今日はExcelを使った便利なVBAマクロのご紹介です。もし、フォルダ内にたくさんのファイルがあって、その情報を一括で整理したいと思ったことがあるなら、この記事はまさにあなたのために書かれています。難しいプログラミングの知識がなくても、安心してください。私たちが一緒にステップバイステップで進めていきますからね。


はじめに

Excelはただの表計算ソフトではない

Excelはただの表計算ソフトではありません。VBA(Visual Basic for Applications)というプログラミング言語を使うことで、さまざまな自動化やカスタマイズが可能になります。特に、日常の業務で大量のファイルを管理する必要がある方にとって、VBAマクロは強力なツールとなります。今回ご紹介するマクロは、指定したフォルダ内のすべてのファイル情報をExcelシートに一覧としてまとめるものです。ファイル名やサイズ、作成日時などの情報を一括で取得できるので、手作業での整理が大幅に楽になりますよ。


マクロの目的と概要

VBAマクロの主な目的

このVBAマクロの主な目的は、指定されたフォルダおよびそのサブフォルダ内に存在するすべてのファイルの情報を抽出し、Excelのアクティブシートに一覧として表示することです。具体的には、以下の情報を取得します:

  • フォルダパス
  • 階層数(フォルダの深さ)
  • ファイル名
  • ファイルサイズ(KB単位)
  • 作成日時
  • 更新日時

この情報をExcelシートに一覧化することで、ファイルの管理や分析が格段にしやすくなります。例えば、プロジェクトフォルダ内のファイルを一括で確認したい場合や、ファイルの更新状況を定期的にチェックしたい場合に非常に便利です。


マクロの仕組み

マクロの仕組み

では、このマクロがどのように動作するのか、簡単に説明しましょう。まず、ユーザーが解析対象のフォルダを選択します。次に、そのフォルダとそのサブフォルダ内のすべてのファイルを再帰的に探索し、各ファイルの情報を取得します。取得した情報は一時的な配列に格納され、最後に一括でExcelシートに書き込まれます。処理中はExcelの画面更新を一時的に無効にすることで、パフォーマンスを向上させています。


マクロのコード解説

マクロのコード解説

では、具体的なVBAコードを見ていきましょう。以下がそのコードです。

Sub ExtractFileInformation()
    ' 目的: 指定されたフォルダ以下のすべてのファイルの情報を抽出する(階層数を含む)
    ' 仕様: フォルダダイアログでフォルダを選択し、ファイルのパス、階層数、名前、サイズ、作成日時、更新日をアクティブシートにリストアップする
    ' 最適化: スクリーンアップデート無効化、計算モード手動設定、一括データ書き込み

    ' スクリーンアップデートと計算モードの設定を保存
    Dim originalScreenUpdating As Boolean
    Dim originalCalcMode As Long
    originalScreenUpdating = Application.ScreenUpdating
    originalCalcMode = Application.Calculation

    ' スクリーンアップデート無効化と計算モード手動設定
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' フォルダ選択ダイアログ
    Dim folderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択してください"
        .AllowMultiSelect = False
        If .Show = -1 Then
            folderPath = .SelectedItems(1)
        Else
            ' ユーザーがキャンセルした場合、サブルーチンを終了
            GoTo CleanExit
        End If
    End With

    ' ファイルシステムオブジェクトと対象フォルダオブジェクトの初期化
    Dim fs As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    Dim targetFolder As Object
    Set targetFolder = fs.GetFolder(folderPath)

    ' 列ヘッダーの設定
    With ActiveSheet
        .Cells.Clear
        .Cells(1, 1).Value = "フォルダパス"
        .Cells(1, 2).Value = "階層数"
        .Cells(1, 3).Value = "ファイル名"
        .Cells(1, 4).Value = "ファイルサイズ (KB)"
        .Cells(1, 5).Value = "作成日時"
        .Cells(1, 6).Value = "更新日時"
    End With

    ' フォルダとサブフォルダ内のファイルを処理
    Dim r As Long
    r = 2 ' ヘッダー行の次から開始
    ProcessFolder targetFolder, r, fs, folderPath, 0

    ' 処理完了メッセージ
    MsgBox folderPath & " 以下のファイル情報を抽出しました。", vbInformation

CleanExit:
    ' 最適化設定を元に戻す
    Application.ScreenUpdating = originalScreenUpdating
    Application.Calculation = originalCalcMode
End Sub

Sub ProcessFolder(ByVal Folder As Object, ByRef r As Long, ByRef fs As Object, ByVal rootPath As String, ByVal level As Integer)
    ' フォルダ内にファイルがある場合のみ、ファイル情報を配列に格納
    If Folder.Files.Count > 0 Then
        ' 一時配列にファイル情報を格納
        Dim fileData() As Variant
        ReDim fileData(1 To Folder.Files.Count, 1 To 6)

        Dim i As Long
        i = 1

        ' 各ファイルの情報を配列に格納
        Dim file As Object
        For Each file In Folder.Files
            fileData(i, 1) = Folder.Path
            fileData(i, 2) = level
            fileData(i, 3) = file.Name
            fileData(i, 4) = file.Size / 1024 ' キロバイト単位
            fileData(i, 5) = file.DateCreated
            fileData(i, 6) = file.DateLastModified
            i = i + 1
        Next file

        ' 配列をシートに一括書き込み
        With ActiveSheet
            .Range(.Cells(r, 1), .Cells(r + Folder.Files.Count - 1, 6)).Value = fileData
        End With

        ' 次の行数を更新
        r = r + Folder.Files.Count
    End If

    ' サブフォルダを再帰的に処理(ファイルの有無に関わらず)
    Dim subFolder As Object
    For Each subFolder In Folder.SubFolders
        ProcessFolder subFolder, r, fs, rootPath, level + 1
    Next subFolder
End Sub

このコードは、指定したフォルダ内のすべてのファイル情報を効率的に取得し、Excelシートに一覧化します。それでは、各部分を詳しく見ていきましょう。


マクロの設定と最適化

まず、マクロの実行前にExcelの設定を一時的に変更して、処理速度を向上させます。具体的には、画面の更新を無効にし、計算モードを手動に設定します。これにより、大量のデータを書き込む際のパフォーマンスが大幅に向上します。処理が完了したら、元の設定に戻すことで、Excelの通常の動作に影響を与えません。

' スクリーンアップデートと計算モードの設定を保存
Dim originalScreenUpdating As Boolean
Dim originalCalcMode As Long
originalScreenUpdating = Application.ScreenUpdating
originalCalcMode = Application.Calculation

' スクリーンアップデート無効化と計算モード手動設定
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

フォルダ選択ダイアログの表示

次に、ユーザーが解析対象のフォルダを選択できるように、フォルダ選択ダイアログを表示します。選択がキャンセルされた場合は、マクロを安全に終了します。

' フォルダ選択ダイアログ
Dim folderPath As String
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "フォルダを選択してください"
    .AllowMultiSelect = False
    If .Show = -1 Then
        folderPath = .SelectedItems(1)
    Else
        ' ユーザーがキャンセルした場合、サブルーチンを終了
        GoTo CleanExit
    End If
End With

ファイルシステムオブジェクトの初期化

選択されたフォルダの情報を取得するために、Scripting.FileSystemObjectを使用します。このオブジェクトを使うことで、フォルダやファイルの詳細情報にアクセスできます。

' ファイルシステムオブジェクトと対象フォルダオブジェクトの初期化
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Dim targetFolder As Object
Set targetFolder = fs.GetFolder(folderPath)

Excelシートの準備

次に、アクティブシートをクリアし、列ヘッダーを設定します。これにより、抽出されたファイル情報が見やすく整理されます。

' 列ヘッダーの設定
With ActiveSheet
    .Cells.Clear
    .Cells(1, 1).Value = "フォルダパス"
    .Cells(1, 2).Value = "階層数"
    .Cells(1, 3).Value = "ファイル名"
    .Cells(1, 4).Value = "ファイルサイズ (KB)"
    .Cells(1, 5).Value = "作成日時"
    .Cells(1, 6).Value = "更新日時"
End With

フォルダ内ファイルの処理

ProcessFolderサブルーチンを使用して、指定フォルダとそのサブフォルダ内のファイルを再帰的に処理します。各ファイルの情報を一時配列に格納し、最後に一括でExcelシートに書き込みます。

' フォルダとサブフォルダ内のファイルを処理
Dim r As Long
r = 2 ' ヘッダー行の次から開始
ProcessFolder targetFolder, r, fs, folderPath, 0

ProcessFolderサブルーチンの詳細は以下の通りです:

Sub ProcessFolder(ByVal Folder As Object, ByRef r As Long, ByRef fs As Object, ByVal rootPath As String, ByVal level As Integer)
    ' フォルダ内にファイルがある場合のみ、ファイル情報を配列に格納
    If Folder.Files.Count > 0 Then
        ' 一時配列にファイル情報を格納
        Dim fileData() As Variant
        ReDim fileData(1 To Folder.Files.Count, 1 To 6)

        Dim i As Long
        i = 1

        ' 各ファイルの情報を配列に格納
        Dim file As Object
        For Each file In Folder.Files
            fileData(i, 1) = Folder.Path
            fileData(i, 2) = level
            fileData(i, 3) = file.Name
            fileData(i, 4) = file.Size / 1024 ' キロバイト単位
            fileData(i, 5) = file.DateCreated
            fileData(i, 6) = file.DateLastModified
            i = i + 1
        Next file

        ' 配列をシートに一括書き込み
        With ActiveSheet
            .Range(.Cells(r, 1), .Cells(r + Folder.Files.Count - 1, 6)).Value = fileData
        End With

        ' 次の行数を更新
        r = r + Folder.Files.Count
    End If

    ' サブフォルダを再帰的に処理(ファイルの有無に関わらず)
    Dim subFolder As Object
    For Each subFolder In Folder.SubFolders
        ProcessFolder subFolder, r, fs, rootPath, level + 1
    Next subFolder
End Sub

処理完了の通知

すべてのファイル情報が抽出され、Excelシートに書き込まれた後、ユーザーに処理完了のメッセージを表示します。

' 処理完了メッセージ
MsgBox folderPath & " 以下のファイル情報を抽出しました。", vbInformation

最適化設定の復元

最後に、マクロの実行前に変更したExcelの設定を元に戻します。これにより、Excelの通常の動作が再開されます。

CleanExit:
    ' 最適化設定を元に戻す
    Application.ScreenUpdating = originalScreenUpdating
    Application.Calculation = originalCalcMode
End Sub

マクロの導入と実行方法

マクロの導入と実行方法

それでは、実際にこのマクロをExcelに導入し、実行する方法を見ていきましょう。初心者の方でも安心して取り組めるように、手順を丁寧に説明します。

1. Excelを開く

まずは、Microsoft Excelを起動します。新しいブックを開くか、既存のブックを使用してください。

2. VBAエディタを起動

キーボードの Alt + F11 を押して、VBAエディタを開きます。これで、VBAコードを入力する準備が整いました。

3. モジュールの挿入

VBAエディタのメニューから 挿入 を選び、 標準モジュール をクリックします。新しいモジュールが作成されます。

4. コードの貼り付け

先ほど紹介したVBAコードを、新しく作成したモジュールにコピー&ペーストします。コードが正しく貼り付けられたことを確認してください。

5. マクロの実行

VBAエディタを閉じて、Excelに戻ります。キーボードの Alt + F8 を押して、マクロダイアログを開きます。リストから ExtractFileInformation を選択し、 実行 をクリックします。

6. フォルダの選択

「フォルダを選択してください」というダイアログが表示されます。解析対象のフォルダを選択し、 OK をクリックします。マクロが実行され、選択したフォルダ内のファイル情報がExcelシートに一覧表示されます。

7. 処理の完了

処理が完了すると、選択フォルダ以下のファイル情報がアクティブシートに表示され、完了メッセージが表示されます。これで、ファイルの管理が一目でできるようになりますね!


実際の使用例

実際の使用例

具体的な使用例を見てみましょう。例えば、プロジェクト管理を行っている場合、各プロジェクトフォルダ内のファイル情報を一括で取得し、進捗管理やファイルの整理に活用できます。また、定期的なバックアップやアーカイブ作業の際にも役立ちます。


よくある質問とトラブルシューティング

よくある質問とトラブルシューティング

マクロが動作しない場合は?

まず、マクロのセキュリティ設定を確認しましょう。Excelの ファイル メニューから オプション を選び、 セキュリティセンターマクロの設定 を確認します。「すべてのマクロを有効にする」に設定することで、マクロが正しく実行されるようになります。ただし、セキュリティリスクもあるため、信頼できるソースからのマクロのみを実行するようにしましょう。

エラーメッセージが表示される場合は?

エラーメッセージが表示された場合、コード内のどこでエラーが発生しているかを確認することが重要です。例えば、指定したフォルダにアクセス権限がない場合や、ファイルが開かれている場合などが考えられます。エラーハンドリングを追加することで、より安定したマクロを作成することができます。

大量のファイルがあると時間がかかる?

確かに、大量のファイルを処理する場合、マクロの実行に時間がかかることがあります。マクロの最適化は既に行っていますが、さらにパフォーマンスを向上させたい場合は、進行状況を表示するプログレスバーを追加するなどの工夫が考えられます。


改善点とカスタマイズ

改善点とカスタマイズ

このマクロは基本的なファイル情報の抽出に優れていますが、さらに便利にするための改善点やカスタマイズも可能です。

1. 追加情報の取得

ファイルの種類や所有者など、さらに詳細な情報を取得するようにコードを拡張することができます。これにより、より多角的なファイル管理が可能になります。

2. 出力フォーマットの変更

ファイルサイズの単位をMBやGBに変更したり、日付のフォーマットをカスタマイズすることで、見やすさを向上させることができます。

3. フィルタ機能の追加

特定のファイルタイプのみを抽出するフィルタ機能を追加することで、必要な情報だけを効率的に取得することができます。

4. 自動実行の設定

特定のタイミングで自動的にマクロを実行するように設定することで、定期的なファイル情報の更新を自動化できます。


まとめ

まとめ

いかがでしたでしょうか?ExcelのVBAマクロを使うことで、フォルダ内のファイル情報を一括で抽出し、業務の効率化を図ることができます。初心者の方でも、今回紹介したステップを踏めば簡単に導入できるはずです。ぜひ試してみて、日常の業務に活用してみてくださいね!

VBAは少し難しく感じるかもしれませんが、慣れてくると非常に強力なツールになります。今回のマクロを基に、さらに自分だけの便利なツールを作り出すことも可能です。皆さんの業務が少しでも楽になれば嬉しいです。


参考サイト

参考サイト

あんちゃん
あんちゃん

最後までお読みいただき、ありがとうございました!もしこの記事が役に立ったと思ったら、ぜひシェアやコメントをお願いします。それでは、また次回の記事でお会いしましょう。お疲れ様でした!

コメント

タイトルとURLをコピーしました