文字罫線を使った階層図を作成する

┣ や┗ などの文字罫線を使ってリストを階層構造に加工するマクロです。
汎用的な仕上げ加工に使います。

階層図

文字罫線入りの階層図を作成するマクロ

Sub 文字罫線で階層図作成()

    Dim rngTa As Range
    Dim rMax As Long, r As Long, c As Long
    Dim flgOn As Boolean
    Dim aryCh As Variant
    
    aryCh = Array("┃", "┳━", "━━", "┣━", "┗━")
    
    Set rngTa = ActiveSheet.UsedRange
    rMax = rngTa.Rows.Count
    
    '各列の重複解消
    For c = rngTa.Columns.Count To 1 Step -1
        For r = rMax To 2 Step -1
            With rngTa(r, c)
                '上と同じ値
                If .Value <> 0 And .Value = .Offset(-1, 0) Then
                    '1列目
                    If c = 1 Then
                        .ClearContents
                    '2列目以降 前列と同じ値
                    ElseIf .Offset(0, -1) = .Offset(-1, -1) Then
                        .ClearContents
                    End If
                End If
            End With
        Next r
    Next c

    '文字罫 入力列を挿入。
    For c = rngTa.Columns.Count To 2 Step -1
        rngTa.Columns(c).Insert shift:=xlShiftToRight
    Next c
    
    '文字罫 入力
    For c = rngTa.Columns.Count To 2 Step -2
        For r = rMax To 1 Step -1
            With rngTa(r, c)
                If .Value > 0 Then '自値あり
                    If .Offset(0, -2) > 0 Then '親値あり
                        .Offset(0, -1) = IIf(flgOn = True, aryCh(1), aryCh(2))
                        flgOn = False
                    Else '親値なし
                        .Offset(0, -1) = IIf(flgOn = True, aryCh(3), aryCh(4))
                        flgOn = True
                    End If
                ElseIf flgOn = True Then '自値なし
                    .Offset(0, -1) = aryCh(0)
                End If
            End With
        Next r
    Next c
    
    '罫線列の幅調整
    For c = 2 To rngTa.Columns.Count Step 2
        rngTa.Columns(c).ColumnWidth = 2
    Next c
    
    Set rngTa = Nothing
End Sub

特に注意が必要な関数やメソッドはないのですが、For 文 や If 文 が入り組んでいるので都度作成するのは面倒なものです。筆者は共通のサブルーチンとして使っています。

 

タイトルとURLをコピーしました