ExcelマクロVBAサンプル集 | エクセルでファイル一覧を作成.4(FileLen,FileDateTime) | ExcelマクロVBAでファイル一覧を作成、サブフォルダ以下を全て取得



最終更新日: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は、銀行型丸め(最近接偶数への丸め)なのです。


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


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


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






同じテーマ「マクロVBAサンプル集」の記事

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

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

VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)
エラーへの対処|MOS VBAエキスパート対策(3月10日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.定数と型宣言文字(Const)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.繰り返し処理(For Next)|ExcelマクロVBA入門



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

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


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





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

    本文下部へ

    ↑ PAGE TOP