エクセルでファイル一覧を作成.№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)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- ファイル一覧を作成
- エクセルでファイル一覧を作成.№4(FileLen,FileDateTime)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。