VBAサンプル集
エクセルでファイル一覧を作成.№6(FileSystemObject1)

ExcelマクロVBAでファイル一覧を作成、サブフォルダ以下を全て取得
公開日:2013年5月以前 最終更新日:2014-11-11

エクセルでファイル一覧を作成.№6(FileSystemObject1)


エクセルでファイル一覧を作成します、


サブフォルダ以下も全て取得し、一覧表示します、



前回の予告通り、FileSystemObjectを使います。


Dir関数では限界があります、というか、かえって面倒です。


FileSystemObjectを使うことによって、すっきりしたコードになりますし、


次回以降の再帰処理もしやすくなります。



前回までのプログラム。




Sub ファイル一覧取得()
  Dim strBuf As String
  Dim strDir As String
  Dim i As Long
  
  If Right(Cells(4, 2), 1) = "\" Then
    strDir = Cells(4, 2)
  Else
    strDir = Cells(4, 2) & "\"
  End If
  
  strBuf = Dir(strDir, vbDirectory)
  If strBuf = "" Then
    MsgBox ("指定のフォルダは存在しません")
    Exit Sub
  End If
  i = 5
  
  Do While strBuf <> ""
    If GetAttr(strDir & strBuf) And vbDirectory Then
      If strBuf <> "." And strBuf <> ".." Then
        Cells(i, 2) = strBuf
        i = i + 1
      End If
    End If
    strBuf = Dir()
  Loop
  
  strBuf = Dir(strDir, vbNormal + vbReadOnly)
  Do While strBuf <> ""
    Cells(i, 2) = strBuf
    Cells(i, 3) = WorksheetFunction.RoundUp(FileLen(strDir & strBuf) / 1024, 0)
    Cells(i, 3).NumberFormatLocal = "0 ""KB"""
    Cells(i, 4) = FileDateTime(strDir & strBuf)
    i = i + 1
    strBuf = Dir()
  Loop
End Sub

これを、FileSystemObjectを使って書き直します。



FileSystemObjectを使用したプログラム


「ツール」→「参照設定」に、「Microsoft Scripting Runtime」にチェックを付けて下さい。




Sub ファイル一覧取得()
  Dim objFSO As FileSystemObject
  Dim objFolder As Folder
  Dim objFolderSub As Folder
  Dim objFile As File
  Dim strDir As String
  Dim i As Long
  
  strDir = Cells(4, 2)
  Set objFSO = New FileSystemObject
  If Not objFSO.FolderExists(strDir) Then
    MsgBox ("指定のフォルダは存在しません")
    Exit Sub
  End If
  
  i = 5
  Set objFolder = objFSO.GetFolder(strDir)
  For Each objFolderSub In objFolder.SubFolders
    Cells(i, 2) = objFolderSub.Name
    i = i + 1
  Next

  

  For Each objFile In objFolder.Files
    With objFile
      Cells(i, 2) = .Name
      Cells(i, 3) = WorksheetFunction.RoundUp(.Size / 1024, 0)
      Cells(i, 3).NumberFormatLocal = "0 ""KB"""
      Cells(i, 4) = .DateLastModified
      i = i + 1
    End With
  Next

  Set objFSO = Nothing

  Set objFolder = Nothing

  Set objFolderSub = Nothing
End Sub


strDir = Cells(4, 2)
FileSystemObjectでは、最後の"\"はどちらでも良いので、セルの値をそのまま入れています。

Set objFSO = New FileSystemObject
インスタンスを生成します。

えっと、インスタンスって何?

ってなりますよね、当然です。

どうしましょうか・・・説明が・・・大変・・・うまく説明出来ない・・・

この下で、インスタンスについて説明します。


objFSO.FolderExists(strDir)

フォルダーの存在確認です。

存在している場合に、Trueが返ります。


Set objFolder = objFSO.GetFolder(strDir)
指定したフォルダを表すFolderオブジェクトを取得しています。

これも解りづらいですよね。

strDirはフルパスの文字列です。

このフルパスが示す、実際のフォルダをオブジェクトとして取得しています。


For Each objFolderSub In objFolder.SubFolders

フォルダオブジェクトのobjFolderに含まれる、サブフォルダを順に取り出します。


Cells(i, 2) = objFolderSub.Name

フォルダオブジェクトの名前を取得します。

フルパスではありません、フォルダ名です。


For Each objFile In objFolder.Files

フォルダオブジェクトのobjFolderに含まれる、ファイルを順に取り出します。


With objFile

  Cells(i, 2) = .Name
  Cells(i, 3) = WorksheetFunction.RoundUp(.Size / 1024, 0)
  Cells(i, 4) = .DateLastModified
objFileの

.Name:名前

.Size:サイズ

.DateLastModified:最終更新日時


Set objFSO = Nothing

オブシェクトの解放をしています。

このオブジェクトの場合は、解放しなくても問題が発生することは無いと思いますが、

オブジェクトによっては、解放しないと誤作動を起こします。

オブジェクトを使ったら、解放する癖をつけましょう。



インスタンスについて



IT用語辞典には、

クラスを基にした実際の値としてのデータのこと。

クラスと対比して用いられることが多く、クラスを「型」、インスタンスを「実体」として説明されることもある。


これ読んで解る人には、最初から説明が不要ですよね。


まず、FileSystemObjectはクラスです。


Dim objFSO As FileSystemObject
は、FileSystemObjectクラス型を指定しているだけです。


Set objFSO = New FileSystemObject

これで、実体をもつオブジェクトが生成されます。


例えば、「家」というクラスがあるとして、


Dim objHouse As 家

は、objHouse は家ですよ、と宣言しただけです。


Set objHouse = New 家

これで新築の家が建つのです。(ただし、飾りっけの無いただの家です)


そして、objHouseのプロパティやメソッドで、家の間取りや装飾を指定して、独特な家を完成させます。


当然、家はいくらでも建てる事が出来ます。


変数を増やして、Newで、どんどん家が建ちます。


また、プロパティやメソッドで、具体的な家が出来た後でも、


Set objFSO = New FileSystemObject


これを実行すれば、元の新築に戻ります。


そして、objHouse = Nothing


これで、家は取り壊しとなります。



うーん、これで理解できますでしょうか・・・


クラスやオブジェクトといっても、WorksheetやRangeは、インスタンスの生成は出来ません。


それは、クラスの構造が違うのです、Newをサポートしていないのです。


正直言って、インスタンスを理解する必要はないでしょう。(本職の方は別ですよ)


オブジェクトには、インスタンスの生成が必要なオブシェクトがあるとだけ覚えて下さい。



次回は、サブフォルダ以下を取得します。


再帰処理です・・・


これも、どうかな、どうやって説明するかが問題です。





同じテーマ「ファイル一覧を作成」の記事

エクセルでファイル一覧を作成.№1(概要)
エクセルでファイル一覧を作成.№2(Dir関数1)
エクセルでファイル一覧を作成.№3(Dir関数2)
エクセルでファイル一覧を作成.№4(FileLen,FileDateTime)
エクセルでファイル一覧を作成.№5(FileDialog)
エクセルでファイル一覧を作成.№6(FileSystemObject1)
エクセルでファイル一覧を作成.№7(FileSystemObject2)
エクセルでファイル一覧を作成.№8(インデント)
エクセルでファイル一覧を作成.№9(罫線)
エクセルでファイル一覧を作成.№10(完成)


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ