今日を乗り切るExcel研究所

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

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

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

階層罫線とは

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

【シンプルタイプ】

f:id:shego:20170422164918p:plain

【カスケードタイプ】

f:id:shego:20170422164602p:plain

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

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

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

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

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

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

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

【手順例】

  1. 階層を持つ項目名のセル範囲を選択する
  2. いったん罫線を「格子」で引く
    • キー操作: AltHBA
  3. ヨコ罫線を消したい範囲を選択する
    • 複数範囲を一度に指定したい場合
       マウス操作: Ctrlを押しながら範囲選択
       キー操作: Shift + 上下矢印(範囲選択)⇒ Shift + F8 (複数選択に追加)
      の繰り返し
  4. [セルの書式設定] ダイアログ ボックスの [罫線] タブで内部ヨコ罫線を削除する
    • キー操作: Ctrl + 1⇒ (Ctrl + TAB) ⇒ Alt + HEnter
  5. タテ罫線を消したい範囲を選択します
    • 複数範囲を一度に指定したい場合
       マウス操作: Ctrlを押しながら範囲選択
       キー操作: Shift + 左右矢印(範囲選択)⇒ Shift + F8 (複数選択に追加)
      の繰り返し
  6. [セルの書式設定] ダイアログ ボックスの [罫線] タブで内部タテ罫線を削除する
    • キー操作: Ctrl + 1⇒ (Ctrl + TAB) ⇒ Alt + VEnter
  7. 以上繰り返し

 



階層罫線を引くマクロ

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

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

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

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 値を変更します。

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

【参考】

参考