エクセルでファイル一覧を作成 | エクセルでファイル一覧を作成.6(FileSystemObject1) | ExcelマクロVBAでファイル一覧を作成、サブフォルダ以下を全て取得



最終更新日: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をサポートしていないのです。


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


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



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


再帰処理です・・・


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






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

エクセルでファイル一覧を作成.7(FileSystemObject2)
エクセルでファイル一覧を作成.8(インデント)
エクセルでファイル一覧を作成.9(罫線)
エクセルでファイル一覧を作成.10(完成)
エクセルでファイル一覧を作成.1(概要)
エクセルでファイル一覧を作成.2(Dir関数1)
エクセルでファイル一覧を作成.3(Dir関数2)

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

空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.ひらがな⇔カタカナの変換|エクセル基本操作
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
6.変数とデータ型(Dim)|ExcelマクロVBA入門
7.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
8.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.定数と型宣言文字(Const)|ExcelマクロVBA入門



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

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


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




    ↑ PAGE TOP