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 ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


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