VBAサンプル集
エクセルでファイル一覧を作成.№4(FileLen,FileDateTime)

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

エクセルでファイル一覧を作成.№4(FileLen,FileDateTime)


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


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



前回のプログラムです。


Sub ファイル一覧取得()
  Dim strBuf As String
  Dim i As Long
  i = 5
  strBuf = Dir(Cells(4, 2), vbNormal + vbReadOnly + vbDirectory)
  Do While strBuf <> ""
    If strBuf <> "." And strBuf <> ".." Then
      Cells(i, 2) = strBuf
      i = i + 1
    End If
    strBuf = Dir()
  Loop
End Sub


とにかく一覧は取得出来ましたが、フォルダとファイルがごちゃ混ぜです。


フォルダだけをまず取得し、それからファイルを取得して、一覧にします。


Sub ファイル一覧取得()
  Dim strBuf As String
  Dim i As Long
  i = 5
  strBuf = Dir(Cells(4, 2), vbDirectory)
  Do While strBuf <> ""
    If GetAttr(Cells(4, 2) & 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(Cells(4, 2), vbNormal + vbReadOnly)
  Do While strBuf <> ""
    Cells(i, 2) = strBuf
    i = i + 1
    strBuf = Dir()
  Loop
End Sub

これで、フォルダが先にきて、その後にファイルがくるようになりました。


strBuf = Dir(Cells(4, 2), vbDirectory)


前回説明しましたが、この指定では、標準ファイルも取得されてしまいます。


そこで、

If GetAttr(Cells(4, 2) & strBuf) And vbDirectory Then

GetAttr(Cells(4, 2) & strBuf)

は、属性を取得する関数です。

フルパスを指定する必要があるので、指定フォルダであるCells(4, 2)を付けています。

戻り値は、Dirの第2引数と同じになります。


しかし、このIf文は分かりづらいですよね。

普通なら、

GetAttr(Cells(4, 2) & strBuf) = vbDirectory

と書きたいところです。

ほとんどの場合は、これでも大丈夫なのですが、いろいろな属性を「+」で追加した場合には、

フォルダが他の属性も持っている場合、例えば、「隠しファイル」でもあった場合は、

これではダメなのです。

この場合は、

GetAttr(Cells(4, 2) & strBuf) = vbDirectory + vbHidden

とする必要があります。

GetAttrの戻り値が、vbDirectory + vbHiddenになるからです。

全パターンを「=」で判断するのは大変です。


ANDなら、上記で判断できるのです。

この説明は大変なので、ごく簡単に。

ANDはビット単位の比較をして、1で一致するビットが存在する場合にTrueを返します。

vbDirectoryは、16(10000)、vbDirectory + vbHiddenは、18(10010)です。

この2つを重ねて、同じ位置に1があるかという判定です。


難しい話はともかく、この場合は、ANDを使って判定することだけ覚えて下さい。

このように判断しておけば、他に転用可能ですので。



strBuf = Dir(Cells(4, 2), vbNormal + vbReadOnly)


これは、標準ファイルと、読み取り専用です。

vbDirectoryを指定していないので、ファイルのみ取得されます。



今回は、ついでに、ファイルサイズと更新日時も取得してみましょう。




Sub ファイル一覧取得()
  Dim strBuf As String
  Dim i As Long
  i = 5
  strBuf = Dir(Cells(4, 2), vbDirectory)
  Do While strBuf <> ""
    If GetAttr(Cells(4, 2) & 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(Cells(4, 2), vbNormal + vbReadOnly)
  Do While strBuf <> ""
    Cells(i, 2) = strBuf
    Cells(i, 3) = WorksheetFunction.RoundUp(FileLen(Cells(4, 2) & strBuf) / 1024, 0)
    Cells(i, 3).NumberFormatLocal = "0 ""KB"""
    Cells(i, 4) = FileDateTime(Cells(4, 2) & strBuf)
    i = i + 1
    strBuf = Dir()
  Loop
End Sub

WorksheetFunction.RoundUp(FileLen(Cells(4, 2) & strBuf) / 1024, 0)

FileLen(ファイル)

これは、ファイルサイズを返す関数です。


WorksheetFunction.RoundUp

これは、ワークシート関数をVBAで使っています。

ワークシートでの関数と使い方は同じです。

全ての関数が使えるわけではありませんが、多くの関数が使えるようになっています。

VBAでは、WorksheetFunctionは、積極的に使用することで、

簡単かつ、スピードアップします。


Cells(i, 3).NumberFormatLocal

書式の設定です。

"0 ""KB"""
は、「123 KB」のように表示する書式を設定しています。

指定の仕方は、セルの書式設定と同じですが、

「"」で全体を囲むので、中に入る、「"」は、「""」のように2つ並べます。


FileDateTime(ファイル)


これは、更新日時を返す関数です。


これで、フォルダが先に表示され、続いてのファイルの一覧に、サイズ、更新日時が表示されます。



切り上げに使った、WorksheetFunction.RoundUp便利ですよね。


これが使用出来ない場合は、結構面倒なんです。


VBとかでは、自分でFunctionを作ったりします。


しかも、FixやらIntやらを使用して、ごちゃごちゃと。


ごく簡単には、0.4999999等を加算して、Roundでも良さそうなのですが、


VBAのRoundは、銀行型丸め(最近接偶数への丸め)なのです。


詳しくは、「関数で銀行型丸め(最近接偶数への丸め)を行う方法 」を参照して下さい。


エクセルの関数で、ROUNDは四捨五入です。しかし、VBAでのRoundは、銀行型丸め(最近接偶数への丸め)で、Accessも銀行型丸めとなっています。四捨五入では、どうしても大きくなる傾向があるようです。

結局、VBをやる人は、みんな自作のFunctionを使っているはずです。


それだけ、エクセルの関数は便利なのです。





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

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


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

最長連続出現数(ランレングス)の算出|エクセル練習問題(2025-11-15)
SQL基礎問題11:連続期間の開始月と終了月を抽出|SQL入門(2025-11-14)
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)


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

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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