今日を乗り切るExcel研究所

Excel に働かされていませんか

Excel の表で階層罫線を引きたい

階層構造を表現した罫線を引くマクロを紹介します。

階層罫線とは

一般に何と呼ばれているのか知りませんが、ここでいう「階層罫線」とは以下のような罫線の引き方をイメージしています。

【シンプルタイプ】

f:id:shego:20170422164918p:plain

【カスケードタイプ】

f:id:shego:20170422164602p:plain

一覧表などで、項目名に大項目・中項目・小項目のような階層構造があるときに、上の行と同じ項目名は空白にして、項目のグループ関係を分かりやすくする事があります。

そのとき、項目の階層の区分けに従って引き分けた罫線を「階層罫線」とここでは呼ぶことにし、上図の2パターンを考えます。

確かに階層罫線を使うと、見る方は分かりやすくていいですが、メンテナンスする方にしたらかなりの面倒です。

手作業でも、最初の一度だけならある種の達成感もありますが、項目の追加削除があるたびに罫線の補修まで強いられるのはとてもガマンできません。

ちなみに、さらに階層によって色分けしたり、セルを結合してタテ中央に寄せにしたものもみることがありますが、今回はパスします。

手作業で階層罫線を引くには

手作業で効率よく階層罫線を引く方法はないものでしょうか。

一つ一つ線を引くのは手間がかかりすぎます。

いったんすべての罫線を削除したあと「外枠」で線を切りなおす手順がマシです。

【手順例】

  1. 階層を持つ項目名のセル範囲を選択します
  2. すでに内部に罫線がある場合は、「枠なし」いったんすべて削除します
    • 外枠も削除されます
  3. 階層罫線が枠線になる四角い領域を選択していきます
    • Ctrl キーを押しながら複数領域を選択していきます
    • 階層の入れ子になった領域を重ねて選択することができます
  4. 罫線の「外枠」コマンドを実行します
    • キー操作: Ctrl+Shift+&
  5. 階層罫線が引かれます

f:id:shego:20171009200445p:plain



階層罫線を引くマクロ

階層が複雑になると手作業では大量の罫線を引くのは大変なので、それを自動で行うマクロを作成しました。

このマクロVBAは、選択範囲内で、値の入っているセルを基準として上辺右方向と左辺下方向の罫線を標準線種で引きます。

上記の「シンプルタイプ」と「カスケードタイプ」の両方に対応します。

ただし、選択範囲の外枠にあたる罫線は変更せずに元のまま残すようにしています。

Sub 階層罫線_標準()
    Const borderLineStyle = xlContinuous ' 実線
    Const borderWeight = xlThin          ' 細
    
    Application.ScreenUpdating = False
    hierarchyBorders Selection, borderLineStyle, borderWeight
    Application.ScreenUpdating = True
End Sub

Private Sub hierarchyBorders(target As Range, borderLineStyle As Integer, borderWeight As Integer)
    Dim bottomRight As Range
    Set bottomRight = target.Cells(target.Rows.Count, target.Columns.Count)
        
    Dim c As Range
    For Each c In target.Cells
        If Not IsEmpty(c) Then
            With Range(c, bottomRight)
                If c.row > target.row Then
                    .Borders(xlEdgeTop).LineStyle = borderLineStyle
                    .Borders(xlEdgeTop).Weight = borderWeight
                End If
                If c.Column > target.Column Then
                    .Borders(xlEdgeLeft).LineStyle = borderLineStyle
                    .Borders(xlEdgeLeft).Weight = borderWeight
                End If
                .Borders(xlInsideVertical).LineStyle = xlNone
                .Borders(xlInsideHorizontal).LineStyle = xlNone
            End With
        End If
    Next
End Sub

【使い方】

  1. VBA標準モジュールに上記マクロのVBAソースをコピー&ペーストします
  2. 対象シートの罫線を引きたいセルにあらかじめ値を設定しておきます
  3. 階層罫線を引くセル領域を範囲選択します
  4. 「階層罫線_標準」マクロを実行します
  5. 標準の線種で階層罫線が設定されます

【注意】操作結果を元に戻すこと(Undo)はできません。

罫線の線種を変更したい場合には、VBA ソースで宣言している2つの Const 値を変更します。

線種の指定値については下記記事が詳しいですが、思ったほど単純なことではないようです。

まとめ

基本的に、階層罫線のような見かけにこだわった本質的でない作業にコストをかけるべきではありません。

こんな面倒な作業はマクロでやっつけて、本来の業務に専念して先に進みましょう。

本記事の内容は Windows 10 の Excel 2013 で動作検証しました。

【更新 2017/10/09】手作業の手順の差し替えと、一部文言を修正しました。

関連記事

www.shegolab.jp

www.shegolab.jp