エクセルでファイル一覧を作成.№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)
Set objFSO = New FileSystemObject
えっと、インスタンスって何?
ってなりますよね、当然です。
どうしましょうか・・・説明が・・・大変・・・うまく説明出来ない・・・
この下で、インスタンスについて説明します。
objFSO.FolderExists(strDir)
フォルダーの存在確認です。
存在している場合に、Trueが返ります。
Set objFolder = objFSO.GetFolder(strDir)
これも解りづらいですよね。
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 ・・・新着記事一覧を見る
列全体を指定する時のRangeとColumnsの違い|ツイッター出題回答 (2023-09-24)
シートのActiveXチェックボックスの指定方法|ツイッター出題回答 (2023-09-24)
ByRef引数の型が一致しません。|ツイッター出題回答 (2023-09-22)
シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- ファイル一覧を作成
- エクセルでファイル一覧を作成.№6(FileSystemObject1)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。