「外枠が実線で、中が細い点線の格子罫線」を引くマクロを紹介します。
↑これを自動で引くマクロですね。
選択したセル範囲にこの罫線を引くマクロですが、
単独のセルから実行した場合は、そのセルを含む表を推定して罫線を引きます。
↑こんな感じでノリノリで引けます。
結構便利ですよ?
実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。
クイックアクセスツールバーやショートカットキーへの登録も便利です。
Ctrl + Tと、Ctrl + L が、同じ「テーブル設置」のショートカットなので、
Line の頭文字だと思って、Lをこのマクロで上書きするのがおすすめ。
「印刷映え」とは
格子罫線を引くだけなら、
こいつでワンクリックです。
これをVBAで書く場合も、
Range("A1:C3").Borders.LineStyle = True
これで簡単に済みますね。
なんですが、このノーマル罫線、印刷すると太いんですよ…。
細い線欲しいな~って思うんですよね。
この解決法、実は簡単で、
なんとこの一番細い点線が、印刷すると点線ではなく細い直線になります。
いままで、「表の中を普通の線、外枠を太線」にしていた方は、
「表の中を最細の点線、外枠を普通の線」に変えてみてください↓
印刷した表がめっちゃ見やすくなって、感動すると思います。
ということで、今回のマクロはこの罫線が目的です。
マクロの仕様
セル範囲を選択して実行時
そのエリアにそのまま点線格子と外枠実線を引きます。
ひとつのセルを選択して実行時
この通り、表のエリアを自動取得して引いてくれます。
ちなみに、この機能は「アクティブセル領域」と呼び、
「Ctrl + Shift + :」 にショートカットがセットされていますので、
試しにやってみてください。
VBAではこの機能を「Rangeオブジェクト.CurrentRegion」で呼ぶことができます。
オートフィルター内の単独セルで実行時
↑で説明した、この「CurrentRegion」さんは、残念なことに、
こんな感じで、表のタイトルとかをちょっとアホの子します。
これのせめてもの回避策として、オートフィルターの中で実行した場合は、
アクティブセル領域でなく、オートフィルターエリアにひきます。
↑その場合は、ついでに見出しの下線も実線にします。
オートフィルターの見出しを選択して実行時
せっかくオートフィルターがあるなら、
「表の下はどこまでデータか」がわかっています。
これを利用し、オートフィルターの「見出し行」のみを選択して実行した場合は、
オートフィルターの最下行まで自動で罫線を引きます。
↓こんな感じで関連する列ごとに区切って実行すると、縦の実線も引けて便利!
以上が細かい仕様です。
割と直感的に引けるようにしたつもりですが、
気に入らなかったらカスタマイズしてください。
なお、便利マクロ全般に言えることですが、
実行した瞬間「元に戻す」ができなくなりますのでご注意を。
ソースコード
' 罫線を引く汎用関数 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ライフに幸あらんことを。