treeコマンドの結果でアウトライン設定
引継ぎか何かで、既存のフォルダ構成の説明資料を作ったりすることがあります。
そんな時によく使うのがtreeコマンドです。
こんな感じにテキストで出力されます。
フォルダー パスの一覧: ボリューム ボリューム ボリューム シリアル番号は XXXX-XXXX です Y:. ├─000_ほげほげ │ ├─その他資料 │ │ ├─FY08-QC診断 │ │ └─FY09-プロジェクト報告会 │ │ ├─作業エリア │ │ │ ├─参考コピー類 │ │ │ │ └─バッファ用 │ │ │ └─目次案等 │ │ ├─報告書 │ │ │ └─OLD │ │ ├─実施要領等 │ │ └─過去版
これはこれでよいのですが、フォルダ数が多いと何かとウツなので、Excelに読込んでアウトライン設定をします。
次の関数は、treeコマンドの出力1行から、アウトラインレベルを判定します。treeコマンドの出力を読込んだ後で、A列にこいつを使った式を入れてやります。(セルA3の式="OutlineLevel(B3)"とか)
Public Function OutlineLevel(s As String) Dim pos Dim leader Dim level pos = InStr(s, "├") If IsNull(pos) Or pos <= 0 Then pos = InStr(s, "└") If IsNull(pos) Or pos <= 0 Then OutlineLevel = 1 Exit Function End If End If leader = Left(s, pos - 1) level = 1 pos = 1 While pos <= Len(leader) If Mid(leader, pos, 3) = "│ " Then pos = pos + 3 ElseIf Mid(leader, pos, 4) = " " Then pos = pos + 4 Else OutlineLevel = 1 Exit Function End If level = level + 1 Wend OutlineLevel = level End Function
でもって、次のプロシージャを実行するコマンドボタンをどっかに配置してクリックすると、アウトラインレベルが設定されます。ただし、アウトラインレベルは最高でも8レベルしか設定できません。(Excelの仕様)
Public Sub アウトライン設定更新() Dim row Dim level On Error Resume Next row = 2 While Cells(row, 1) <> "" Err.Clear level = CInt(Cells(row, 1)) If Err.Number = 0 Then If level > 8 Then level = 8 End If Rows(row).OutlineLevel = level End If row = row + 1 Wend On Error GoTo 0 End Sub
まあ、treeコマンドなんか使わずに、VBAで直接フォルダ見にいけばいいんですけどね。