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


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

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

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


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





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

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


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

VBAコードの全プロシージャー・プロパィ一覧を取得|VBAサンプル集(10月12日)
VBAでエラー行番号を取得できるErl関数|VBA技術解説(10月12日)
手動計算時の注意点と再計算方法|ExcelマクロVBA技術解説(10月9日)
引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門(10月7日)
VBEの使い方:デバッグ|ExcelマクロVBA入門(10月6日)
VBAにおける配列やコレクションの起点について|VBA技術解説(10月5日)
VBEの使い方:オブジェクト ブラウザー|VBA入門(10月5日)
VBEの使い方:ウォッチ ウィンドウ|VBA入門(10月4日)
VBEの使い方:ローカル ウィンドウ|VBA入門(10月3日)
VBEの使い方:イミディエイト ウィンドウ|VBA入門(10月2日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



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

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


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




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