昨年、「Cドライブの空き容量が20%を切りました。今後どうすればいいのでしょうか?」という質問があった。この時使ってみた DriveAnalyzer は、確かに可視的に解るので面白いソフトであるが、何でもかんでもため込んだ人 に「何故そうなったか?」を解らせることは無理‥‥ と感じた。
今回使った Filistry はファイルをリストアップするソフトである。結果を csv で出力すると Excel で解析できる。更に、使ってみて解ったことであるが、USB にインストールできる ので、「何でもかんでもため込んだ人」のパソコンに差し込んで、データを取得すれば、持ち帰って解析できる利点がある...
■ VBAの作成
やってみてわかったことであるが、フォルダごとの容量が得られない。そこで、パス名を任意の位置で切るVBAを作成、Excel の[集計]でフォルダごとの容量がわかるようにした。
VBA は 単独のテキストファイル(後述)とし、インポートで取り込む方式とした。
■ Filistry ver.1.36 の設定
下記以外はデフォルトどおりとした。(たぶん)
■ Filistry [実行]結果
マイドキュメントを指定して[実行]すると、次のような表ができる。
- 5行目がタイトル行となる。(タイトル行の塗りつぶしは自分で行う)
- 実際のデータは6行目以降となる。 (上記例では、6〜11,561行目)
- G〜I 列は、後から追加したもの。
■ Excel 上での編集
- VBA のインポート
- [ツール]メニュー ⇒[マクロ]⇒[Visual Basic Editor]([Alt]+[F11])
- [ファイル]メニュー ⇒[ファイルのインポート]
- 上記の FilistryVBA.bas を[開く]
- 閉じる
- タイトルの追加
- セルG6: “DF” ‥‥ その行が、Directory情報か File情報かの区別
- セルH6: “レベル” ‥‥ A列のパスを切る位置(“\”の数)
- セルI6: “レベルパス” ‥‥ A列を「レベル」で切った後のパス
- セルG6(DF)の入力: “=getDF(C6,D6)”
以下の行は、フィルハンドルでコピーする。 - セルH6(レベル)の入力: 適当に入力する。
以下の行は、フィルハンドルでコピーするか、手入力する。 - セルI6(レベルパス)の入力: “=getLevelPath(A6,H6)”
以下の行は、フィルハンドルでコピーする。 - 自動計算をオフにする。 ‥‥ 忘れると、以下の処理で固まったような状態になる。(止められない)
- [ツール]メニュー ⇒[オプション]⇒[計算方法]タブ
- 「計算方法」を 8 手動 にする。
- 「DF」が“1”(ファイルデータ)以外のレコードを削除し、
- 「レベルパス」で[集計]する。
Attribute VB_Name = "FilistryVBA" Option Explicit '概要:argパス から argレベル 数番目の"\"の前までのパスを返す。 '履歴:H23.10.30 初版 Public Function getLevelPath(argパス As String, argレベル As Variant) As String On Error GoTo Err_getLevelPath Dim mbTitle As String Dim lngLevel As Long Dim i As Long, s As Long, ss As Long Dim strLevelPath As String mbTitle = "FilistryVBA/getLevelPath" If argレベル = "" Then strLevelPath = "" GoTo Exit_getLevelPath End If lngLevel = Val(argレベル) ss = 0 For i = 1 To lngLevel s = InStr(ss + 1, argパス, "\", vbBinaryCompare) If s = 0 Then Exit For Else ss = s End If Next If ss = 0 Then strLevelPath = argパス Else strLevelPath = Left(argパス, ss) End If Exit_getLevelPath: If Right(strLevelPath, 1) = "\" Then getLevelPath = Left(strLevelPath, Len(strLevelPath) - 1) Else getLevelPath = strLevelPath End If Exit Function Err_getLevelPath: MsgBox Err.Number & "/" & Err.Description, vbCritical, mbTitle Resume Exit_getLevelPath End Function '概要:ファイルであれば 1、ファルダであれば 2、それ以外は 99 を返す。 '履歴:H23.10.30 初版 Public Function getDF(argサイズ As String, arg拡張子 As String) As Long If Left(argサイズ, 3) = "DIR" Then getDF = 2 ElseIf arg拡張子 <> "" Then getDF = 1 Else getDF = 99 End If End Function