和風スパゲティのレシピ

日本語でコーディングするExcelVBA

印刷映えする格子罫線を自動で引くマクロ

外枠が実線で、中が細い点線の格子罫線」を引くマクロを紹介します。


格子罫線サンプル

↑これを自動で引くマクロですね。


選択したセル範囲にこの罫線を引くマクロですが、
単独のセルから実行した場合は、そのセルを含む表を推定して罫線を引きます


自動罫線マクロサンプル

↑こんな感じでノリノリで引けます。

結構便利ですよ?


実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

クイックアクセスツールバーやショートカットキーへの登録も便利です。


Ctrl + Tと、Ctrl + L が、同じ「テーブル設置」のショートカットなので、
Line の頭文字だと思って、Lをこのマクロで上書きするのがおすすめ。

 

「印刷映え」とは

格子罫線を引くだけなら、

格子罫線を普通に設定

こいつでワンクリックです。


これをVBAで書く場合も、

Range("A1:C3").Borders.LineStyle = True

これで簡単に済みますね。



なんですが、このノーマル罫線、印刷すると太いんですよ…。
細い線欲しいな~って思うんですよね。



この解決法、実は簡単で、

最細点線の選択画面

なんとこの一番細い点線が、印刷すると点線ではなく細い直線になります



いままで、「表の中を普通の線、外枠を太線」にしていた方は、
「表の中を最細の点線、外枠を普通の線」に変えてみてください↓

罫線の太さ比較

印刷した表がめっちゃ見やすくなって、感動すると思います。


ということで、今回のマクロはこの罫線が目的です。

マクロの仕様

セル範囲を選択して実行時

そのエリアにそのまま点線格子と外枠実線を引きます。

ひとつのセルを選択して実行時

自動罫線マクロサンプル

この通り、表のエリアを自動取得して引いてくれます。


ちなみに、この機能は「アクティブセル領域」と呼び、
「Ctrl + Shift + :」 にショートカットがセットされています
ので、
試しにやってみてください。

VBAではこの機能を「Rangeオブジェクト.CurrentRegion」で呼ぶことができます。

オートフィルター内の単独セルで実行時

↑で説明した、この「CurrentRegion」さんは、残念なことに、

アホの子Region

こんな感じで、表のタイトルとかをちょっとアホの子します。


これのせめてもの回避策として、オートフィルターの中で実行した場合は、
アクティブセル領域でなく、オートフィルターエリアにひきます。

オートフィルターへ適用

↑その場合は、ついでに見出しの下線も実線にします。

オートフィルターの見出しを選択して実行時

せっかくオートフィルターがあるなら、
「表の下はどこまでデータか」がわかっています。


これを利用し、オートフィルターの「見出し行」のみを選択して実行した場合は、
オートフィルターの最下行まで自動で罫線を引きます


↓こんな感じで関連する列ごとに区切って実行すると、縦の実線も引けて便利!

オートフィルター表への自動罫線アニメ




以上が細かい仕様です。


割と直感的に引けるようにしたつもりですが、
気に入らなかったらカスタマイズしてください。


なお、便利マクロ全般に言えることですが、
実行した瞬間「元に戻す」ができなくなりますのでご注意を。

ソースコード

' 罫線を引く汎用関数
Sub 点線格子を引き外枠を実線にする(指定エリア As Range, is第1行の下線も実線にする As Boolean)
    With 指定エリア
        .Borders.LineStyle = True
        .Borders.Weight = xlThin
        .Borders(xlInsideVertical).Weight = xlHairline
        .Borders(xlInsideHorizontal).Weight = xlHairline
        If is第1行の下線も実線にする Then
            .Resize(1, .Columns.Count).Borders(xlEdgeBottom).Weight = xlThin
        End If
    End With
End Sub

' 実行用マクロ
Sub 点線格子罫線のショートカット()

    ' ◇ オートフィルター内で実行した場合は別の処理
    If ActiveSheet.AutoFilterMode = True Then
        If Not Intersect(Selection, ActiveSheet.AutoFilter.Range) Is Nothing Then
            Call オートフィルターエリアに点線格子罫線を引く(Selection)
            Exit Sub
        End If
    End If

    Dim 実行エリア As Range
    
    ' 単独セルから実行した場合はCurrentRegionで実行とみなす
    If Selection.Cells.Count = 1 Then
        Set 実行エリア = Selection.CurrentRegion
    Else
        Set 実行エリア = Selection
    End If

    ' 罫線汎用関数をCall
    Call 点線格子を引き外枠を実線にする(実行エリア, False)

End Sub

' オートフィルター内で実行した場合の分岐
Private Sub オートフィルターエリアに点線格子罫線を引く(実行エリア As Range)
    With ActiveSheet.AutoFilter.Range
        
        ' 見出し行で実行時は、オートフィルター最終行まで引いて、見出し下線を実線に
        If 実行エリア.Rows.Count = 1 And 実行エリア.Row = .Row Then
            Call 点線格子を引き外枠を実線にする(Intersect(実行エリア.EntireColumn, .Cells), True)
        
        ' 単独セルから実行時はオートフィルターエリア全体にひく
        ElseIf Selection.Cells.Count = 1 Then
            Call 点線格子を引き外枠を実線にする(.Cells, True)

        ' それ以外は選択エリアにそのまま引く
        Else
            Call 点線格子を引き外枠を実線にする(実行エリア, False)
        End If

    End With
End Sub

 

コードの解説

3つの関数からなります。


まず一番上の関数

Sub 点線格子を引き外枠を実線にする(指定エリア As Range _
                                              , is第1行の下線も実線にする As Boolean)

ですが、
これは引数「指定エリア」にストレートに今回の罫線を引く、
いわゆるメインコードです。

第1引数のRangeオブジェクトに罫線を引きますが、
第2引数「is第1行の下線も実線にする」にTrueを渡すと、
引数名の通り、見出しの下線も追加します。


この関数は、今回の便利マクロに限らず、
データを加工するマクロならなんでも使えますので、
汎用関数に切り出しています。

実行モジュールと同じモジュールにある必要はないので、
全マクロ共通の汎用関数リストなどある場合は、
そちらに移してOKです。


残りの二つの関数は、実行したSelectionの形と位置を判定し、
↑の汎用関数の呼び出し方を分岐する、実行用のプロシージャですね。

分岐の内容は「仕様」で示した通りなので、
解説は割愛させてください。


ひとつコーディングのポイントを挙げるとしたら、
「列全体」×「長方形エリア」の交差部分Intersectを取ると、
「長方形エリアの縦のブロックを列番号指定で取ってこれる」
点でしょうか。

' オートフィルターエリアの中で、実行エリアと同じ列のブロック
Intersect(実行エリア.EntireColumn, ActiveSheet.AutoFilter.Range)

データを列ごとに処理する際に、結構スッキリ書くポイントになりますので、
覚えておくといいかもしれません。


以上で解説を終わります。

あなたのExcelライフに幸あらんことを。