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

テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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