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で直接フォルダ見にいけばいいんですけどね。