エクセルでファイル一覧を作成 | エクセルでファイル一覧を作成.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を使っているはずです。


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






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

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

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

最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)
ファイルの一覧取得・削除(File)|Google Apps Script入門(1月24日)
フォルダの一覧取得・作成・削除(Folder)|Google Apps Script入門(1月24日)
フォルダとファイルを扱う(DriveApp)|Google Apps Script入門(1月24日)
スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)

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

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



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

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


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

    ↑ PAGE TOP