【簡単エクセル/Excel VBA マクロ】ファイル・フォルダの一覧を取得する|アプリ事例 #003

アフィリエイト広告を利用しています。
Information
運営者・ポテ

いつもありがとうございます!

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。

皆さんは、フォルダ内のファイルやフォルダの一覧を取得したいときはありませんか。

例えば、ファイルの整理をするときなどです。マクロを作成する方は、全ファイルを逐次的に操作する際などにファイルの一覧を取得することがあるでしょう。

この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。

VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。

VBAでファイル・フォルダの一覧を取得する方法

アプリの仕様

指定したフォルダ内の全てのファイルとフォルダを、Excelシートに出力します。

前提条件

下図のように、マクロが記述される「ファイル・フォルダの一覧を取得する.xlsm」と同じ階層に、ファイルやフォルダが格納されている「フォルダ」が存在しているものとします。

「フォルダ」の中身は、下図のようになっています。

Excelシートの設計

取得したファイルとフォルダを表示するためのExcelシートを準備します。下図のようなシートを作成しましょう。

コードの実装

フォルダ内の全てのファイルとフォルダをExcelシートに出力するコードと、その実行結果を以下に示します。

Sub ListFolderContentsToSheet()


    ' 使用ライブラリ
    ' Microsoft Scripting Runtime (FileSystemObject を使用)
    
    
    ' 変数宣言
    Dim thiswb As Workbook         ' 現在のワークブック
    Dim thiswb_ws1 As Worksheet    ' 現在のワークブックの1つ目のワークシート
    Dim fso As FileSystemObject    ' ファイルシステムオブジェクト(フォルダやファイル操作用)
    Dim source_folder As String    ' ソースとなるフォルダのパス
    Dim source_file As Object      ' 各ファイルを表すオブジェクト
    Dim sub_folder As Object       ' 各フォルダを表すオブジェクト
    Dim row_idx As Long            ' 行のインデックス(書き込み用の行番号)
    Dim serial_num As Long         ' 通し番号を保持する変数
    
    
    ' ワークブックとワークシートを変数に代入
    Set thiswb = ThisWorkbook
    Set thiswb_ws1 = thiswb.Worksheets(1)
    
    
   ' FileSystemObjectのインスタンスを生成し変数に代入
    Set fso = New FileSystemObject
    
    
    ' ソースフォルダを変数に代入
    source_folder = ThisWorkbook.Path & "\フォルダ"
    
    
    ' ワークシートの初期化(内容と書式をクリア)
    thiswb_ws1.Rows("3:" & thiswb_ws1.Rows.Count).Clear
    
    
    ' 行番号と通し番号の初期値を設定
    row_idx = 3    ' 行番号
    serial_num = 1 ' 通し番号
    
    
    ' フォルダ内の全フォルダを書き込む
    For Each sub_folder In fso.GetFolder(source_folder).SubFolders
        
        thiswb_ws1.Cells(row_idx, 1) = serial_num ' 通し番号をA列に追加
        
        thiswb_ws1.Hyperlinks.Add _
            Anchor:=thiswb_ws1.Cells(row_idx, 2), _
            Address:=sub_folder.Path, _
            TextToDisplay:=sub_folder.Name ' フォルダ名にハイパーリンクを設定
        
        row_idx = row_idx + 1
        
        serial_num = serial_num + 1 ' 通し番号をインクリメント
    
    Next sub_folder
    
    
    ' フォルダ内の全ファイルを書き込む
    For Each source_file In fso.GetFolder(source_folder).Files
    
        thiswb_ws1.Cells(row_idx, 1) = serial_num ' 通し番号をA列に追加
        
        thiswb_ws1.Hyperlinks.Add _
            Anchor:=thiswb_ws1.Cells(row_idx, 2), _
            Address:=source_file.Path, _
            TextToDisplay:=source_file.Name ' ファイル名にハイパーリンクを設定
        
        thiswb_ws1.Cells(row_idx, 3) = Round(source_file.Size / 1024, 2) & " KB" ' ファイルサイズをC列に移動して表示
        
        row_idx = row_idx + 1
        
        serial_num = serial_num + 1 ' 通し番号をインクリメント
    
    Next source_file
    
    
    ' C列を右揃えに設定
    thiswb_ws1.Columns("C:C").HorizontalAlignment = xlRight
    
    
    ' オブジェクトを開放
    Set source_file = Nothing
    Set sub_folder = Nothing
    Set fso = Nothing
    

End Sub
運営者・ポテ

解説していきます!

    ' 使用ライブラリ
    ' Microsoft Scripting Runtime (FileSystemObject を使用)

これはコードの一部ではありませんが、この コードを実行するために必要なライブラリをコメントとして記載しています。

このMicrosoft Scripting Runtimeを使用することで、FileSystemObject というオブジェクトを操作することができるようになります。つまり、ファイルやフォルダに関する情報を取得したり操作したりすることができます。

Information
  • オブジェクト
    特定の役割を持つ道具のようなものです。
  • ライブラリ
    特定の機能をもったコードの集合体です。ソフトウェア作成における部品のようなものです。新しいアプリケーションを作成する際、ライブラリを使用することで、プログラマーは複雑なコードを自分で書く必要がなくなります。

ライブラリの参照設定は以下の手順で行うことができます。

VBE画面から「ツール」--> 「参照設定」を開きます。

参照設定の挿絵

Microsoft Scripting Runtimeにチェックを入れて、「OK」を押します。なお、これらのライブラリを初めて設定する場合、上位には表示されていません。アルファベット順に従ってリストの下の方に表示されていますので、慌てずに探してください。

参照設定

以上で、ライブラリの参照設定は終了です。

    ' 変数宣言
    Dim thiswb As Workbook         ' 現在のワークブック
    Dim thiswb_ws1 As Worksheet    ' 現在のワークブックの1つ目のワークシート
    Dim fso As FileSystemObject    ' ファイルシステムオブジェクト(フォルダやファイル操作用)
    Dim source_folder As String    ' ソースとなるフォルダのパス
    Dim source_file As Object      ' 各ファイルを表すオブジェクト
    Dim sub_folder As Object       ' 各フォルダを表すオブジェクト
    Dim row_idx As Long            ' 行のインデックス(書き込み用の行番号)
    Dim serial_num As Long         ' 通し番号を保持する変数

ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型 の構文で宣言します。これにより、各変数は As 以降で指定したデータ型のデータを格納できるようになります。

    ' ワークブックとワークシートを変数に代入
    Set thiswb = ThisWorkbook
    Set thiswb_ws1 = thiswb.Worksheets(1)

ここでは、オブジェクト変数 thiswbthiswb_ws1 に、それぞれワークブックオブジェクトとワークシートオブジェクトを代入しています。なお、ThisWorkbook は現在のワークブック、つまりこのコードが記述されているワークブックを指します。

   ' FileSystemObjectのインスタンスを生成し変数に代入
    Set fso = New FileSystemObject

ここでは、FileSystemObjectを新しく作成し、そのオブジェクトを fso という変数に代入しています。FileSystemObject は、ファイルやフォルダを操作するためのオブジェクトで、これを使うことでフォルダ内のファイルリストを取得したり、ファイルの存在確認、コピー、削除などの操作が可能になります。

    ' ソースフォルダを変数に代入
    source_folder = ThisWorkbook.Path & "\フォルダ"

ここでは、source_folder という変数に、ソースとなるフォルダのパスを代入しています。ThisWorkbook.Path は、現在実行中のワークブックが保存されているフォルダのパスを取得します。これに "\フォルダ" を追加することで、ThisWorkbookと同階層にある「フォルダ」という名前のフォルダを指定しています。

    ' ワークシートの初期化(内容と書式をクリア)
    thiswb_ws1.Rows("3:" & thiswb_ws1.Rows.Count).Clear

ここでは、ワークシートの初期化を行っています。thiswb_ws1.Rows("3:" & thiswb_ws1.Rows.Count).Clear というコードにより、3行目から最終行までのすべての行の内容と書式がクリアされます。これにより、前回の処理結果や不要なデータを削除し、新しいデータをクリーンな状態で書き込む準備が整います。

    ' 行番号と通し番号の初期値を設定
    row_idx = 3    ' 行番号
    serial_num = 1 ' 通し番号

ここでは、行番号と通し番号の初期値を設定しています。row_idx = 3 によって、データを書き込む開始行を3行目に指定しています。serial_num = 1 は、通し番号の初期値を1に設定しています。これにより、データが3行目から書き込まれ、各項目には通し番号が1から順に割り振られるようになります。

    ' フォルダ内の全フォルダを書き込む
    For Each sub_folder In fso.GetFolder(source_folder).SubFolders
        
        thiswb_ws1.Cells(row_idx, 1) = serial_num ' 通し番号をA列に追加
        
        thiswb_ws1.Hyperlinks.Add _
            Anchor:=thiswb_ws1.Cells(row_idx, 2), _
            Address:=sub_folder.Path, _
            TextToDisplay:=sub_folder.Name ' フォルダ名にハイパーリンクを設定
        
        row_idx = row_idx + 1
        
        serial_num = serial_num + 1 ' 通し番号をインクリメント
    
    Next sub_folder

ここでは、指定したフォルダ内のすべてのサブフォルダをワークシートに書き込む処理を行っています。

  • For Each sub_folder In fso.GetFolder(source_folder).SubFolders で、source_folder 内のすべてのサブフォルダを取得し、sub_folder というオブジェクトで順番に処理しています。
  • thiswb_ws1.Cells(row_idx, 1) = serial_num では、現在の行(row_idx)のA列に、通し番号を書き込んでいます。
  • thiswb_ws1.Hyperlinks.Add の部分では、B列にフォルダ名を表示し、フォルダ名にハイパーリンクを設定しています。Address にフォルダのパス、TextToDisplay にフォルダ名が表示されるようにしています。
  • row_idx = row_idx + 1 で、次の行に移動し、serial_num = serial_num + 1 で通し番号を1つ増やして、次のフォルダが次の行に書き込まれるようにしています。
  • serial_num = serial_num + 1 は、通し番号を1つ増やす操作です。これを「インクリメント」と呼びます。次のアイテムが処理されるたびに通し番号が順に増えていきます。

このループは、すべてのサブフォルダが処理されるまで続きます。

    ' フォルダ内の全ファイルを書き込む
    For Each source_file In fso.GetFolder(source_folder).Files
    
        thiswb_ws1.Cells(row_idx, 1) = serial_num ' 通し番号をA列に追加
        
        thiswb_ws1.Hyperlinks.Add _
            Anchor:=thiswb_ws1.Cells(row_idx, 2), _
            Address:=source_file.Path, _
            TextToDisplay:=source_file.Name ' ファイル名にハイパーリンクを設定
        
        thiswb_ws1.Cells(row_idx, 3) = Round(source_file.Size / 1024, 2) & " KB" ' ファイルサイズをC列に移動して表示
        
        row_idx = row_idx + 1
        
        serial_num = serial_num + 1 ' 通し番号をインクリメント
    
    Next source_file

ここでは、指定したフォルダ内のすべてのファイルをワークシートに書き込む処理を行っています。

  • For Each source_file In fso.GetFolder(source_folder).Files で、source_folder 内のすべてのファイルを取得し、source_file というオブジェクトで順番に処理しています。
  • thiswb_ws1.Cells(row_idx, 1) = serial_num では、現在の行(row_idx)のA列に通し番号を書き込んでいます。
  • thiswb_ws1.Hyperlinks.Add の部分では、B列にファイル名を表示し、そのファイル名にハイパーリンクを設定しています。Address にファイルのパス、TextToDisplay にファイル名を設定しています、
  • thiswb_ws1.Cells(row_idx, 3) = Round(source_file.Size / 1024, 2) & " KB" では、ファイルサイズをKB単位でC列に表示します。source_file.Size で取得したサイズをKBに変換し、Round 関数で小数点以下2桁に丸めています。
  • row_idx = row_idx + 1 で次の行に移動し、serial_num = serial_num + 1 で通し番号を1つ増やします。

このループは、フォルダ内のすべてのファイルが処理されるまで続きます。

    ' C列を右揃えに設定
    thiswb_ws1.Columns("C:C").HorizontalAlignment = xlRight

ここでは、ワークシートのC列に対して右揃えの設定を行っています。

    ' オブジェクトを開放
    Set source_file = Nothing
    Set sub_folder = Nothing
    Set fso = Nothing

ここでは、使用したオブジェクトを解放しています。

この操作は必須ではありませんが、 コーディングの良い習慣として、使用が終わったオブジェクトは開放することが推奨されます。これにより、メモリの無駄な消費を防ぐことができます。

以上で解説は終了です。

VBAスキルアップの参考情報

近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。

分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。

とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。

全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。

そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。

「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。

VBAのスキルアップ

VBAを学び始めるなら

入門書は、どれを選んでも大きな差はないように感じます。

どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。

もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

基礎を超えて力をつけたいなら

私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。

今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。

このレベルの本を一冊持っておくことに、損はないでしょう。


資格で能力を証明したいなら

VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。

特に「スタンダード」の方は上級者向けです。

あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。

以下の公式テキストが販売されています。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。

これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。

今はAIにコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


こちらの記事でも紹介しています。もしよろしければご覧ください。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

ご覧いただきありがとうございました!

この記事では、「ファイル・フォルダの一覧を取得するアプリ」の紹介しました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。

コメントを残す

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