先日、VBAのセミナーをやったとき、受講された方から「ちょっと、仕事で使ってるマクロを見てもらえますか?」と言われました。ウェルカムです。私のセミナーでは、みなさんからの質問が多いです。もちろん、セミナーでお話ししている内容ばかりではありません。VBAのセミナーでワークシート関数の質問をされることもありますし、セミナーの内容とは関係なく、仕事で悩んでいることや困っていることを質問されるなんてのも日常茶飯事です。さて、先日「ちょっと見てもらえますか?」と質問されたマクロなのですが、要するに"あれこれ"やってましたw まぁ、実務なのですから、仕方ありませんね。その中で「罫線を引く」という操作が書かれていました。それが何とも冗長で。一目で「あ、これ、マクロ記録したコードそのまま使ってるでしょ」と分かりました。「罫線の操作って、よく分からないんですよね~」と言われましたので、罫線を操作するコツをご紹介します。
まず、最も重要なポイントです。これを、しっかり認識してください。
「たくさんある」というのは、実線とか点線など罫線の種類ではありません。セルの中で、罫線を引く場所のことです。罫線は、次の場所に対して個別に引くことができます。
まず、単一セルに対しては、上下と左右、さらにセルの内部に右上がり斜めと、右下がり斜めの6種類です。外枠というのはありません。外枠は、上下左右を引いた状態です。
さらに、複数のセル(セル範囲)に対しては、あと2種類あります。セル範囲内での横(水平)と、縦(垂直)です。
これらの各罫線を個別に指定できます。罫線はBorderオブジェクトなので、指定するときはBordersコレクションを使います。←これ、もしかすると意味の分からない方がいるかもしれません。すみません、この件を詳しく解説すると長くなりますので、ここでは「そういうものだ」と飲み込んでください。ちなみに、私の「VBAベーシック セミナー」では、このへんを詳しく解説しています。それぞれの罫線を特定するときは、次のように定数を指定します。
このように、罫線を引ける場所は全部で8カ所あります。そして、それぞれの罫線に対して、次の設定ができます。
次の定数を指定します。
定数 | 値 | 線種 | イメージ |
---|---|---|---|
xlContinuous | 1 | 実線 | |
xlDash | -4115 | 破線 | |
xlDashDot | 4 | 一点鎖線 | |
xlDashDotDot | 5 | ニ点鎖線 | |
xlDot | -4118 | 点線 | |
xlDouble | -4119 | 2 本線 | |
xlLineStyleNone | -4142 | 線なし | |
xlSlantDashDot | 13 | 斜破線 |
一般的には「実線」を引くことが多いので、定数xlContinuousを指定します。ちなみに「Continuous」というのは、"つながった"とか"途切れていない"などを意味する英単語です。定数xlContinuousの実数は「1」なので、定数の代わりに数値の「1」を指定しても罫線を引けますし、試したところTrueでもいけます。
Sub Macro1() Range("B2").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("B3").Borders(xlEdgeBottom).LineStyle = 1 Range("B4").Borders(xlEdgeBottom).LineStyle = True End Sub
すでに引いてある罫線を消すときは、定数「xlLineStyleNone」を指定するか、実数の「-4142」を指定します。こちらもなぜか、Falseでも消せます。
Sub Macro2() Range("B2").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone Range("B3").Borders(xlEdgeBottom).LineStyle = -4142 Range("B4").Borders(xlEdgeBottom).LineStyle = False End Sub
次の定数を指定します。
定数 | 値 | 線種 |
---|---|---|
xlHairline | 1 | 細線 (最も細い罫線) |
xlMedium | -4138 | 普通 |
xlThick | 4 | 太線 (最も太い罫線) |
xlThin | 2 | 極細 |
Weightプロパティを指定しないと、定数「xlThin」が指定されたものとみなされます。
罫線の色を指定するときは、ColorプロパティにRGB値を指定するか、ColorIndexプロパティに色パレットの番号を指定するか、ThemeColorプロパティにテーマの色名を指定します。それぞれ、何を指定すればいいか分からなかったら、ここはマクロ記録してください。ただ、一般的には黒(というか自動)を指定することが多いでしょう。色を指定しないと「自動」になります。本当は「黒」と「自動」では意味が違うのですが、それほど気にしないでもいいでしょう。
色のThemeColorを指定したとき、色の明暗を指定できます。まぁ、このへんも、凝った色の罫線を引きたいのでしたら、マクロ記録してください。
罫線を引く操作をマクロ記録すると、次のようなコードが記録されます。試しに、選択している単一セルに「下線」を引いてみました。
Sub Macro3() Selection.Borders(xlDiagonalDown).LineStyle = xlNone ''右下がり斜めを引かない Selection.Borders(xlDiagonalUp).LineStyle = xlNone ''右上がり斜めを引かない Selection.Borders(xlEdgeLeft).LineStyle = xlNone ''左を引かない Selection.Borders(xlEdgeTop).LineStyle = xlNone ''上を引かない With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Selection.Borders(xlEdgeRight).LineStyle = xlNone ''右を引かない Selection.Borders(xlInsideVertical).LineStyle = xlNone ''範囲内縦を引かない Selection.Borders(xlInsideHorizontal).LineStyle = xlNone ''範囲内横を引かない End Sub
下線だけを引く操作をマクロ記録すると、上のようなコードが記録されます。分かりますか?LineStyleプロパティに定数「xlNone」を指定しているところは、すべて「引かない」と指定しています。確かに、言ってることは正しいですけど、でも「引かない」という指定をする必要はありません。だって、「引く」と指定しなかったら、引かれないのですから。したがって「引かない」のコードは、すべて不要です。
Sub Macro3() With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub
ColorIndexプロパティに「0」を指定すると「自動」になります。でも、そもそもColorIndexプロパティは、省略すれば「自動」です。だったら、省略できます。色を指定しないのですから、TintAndShadeプロパティも必要ありません。ちなみにTintAndShadeプロパティに指定している「0」は、「明暗なし(標準)」です。さらに、Weightプロパティも、省略すると定数「xlThin」が指定されたことになるのですから、これも必要ありません。つまり、選択したセルの「下線だけ」を引くのでしたら、これで十分です。
Sub Macro3() Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous End Sub
また、罫線に関しては、便利な仕組みが2つ用意されています。Bordersコレクションは、一般的に「Borders(xlEdgeBottom)」と、括弧の中に"どの罫線"かを指定します。しかし、この"どの罫線"を指定しないで、ただ「Borders」と書くと、セルの上下左右の罫線つまりセルの外枠という意味になります。したがって、セルに外枠罫線を引くのでしたら、次のようにすればいいです。
Sub Macro4() Range("B2").Borders.LineStyle = True End Sub
勘違いしないでくださいね。これは「セルの外枠」です。ですから、次のように「セル範囲の外枠」に罫線を引くことはできません。この場合は「格子」罫線になります。
Sub Macro5() Range("B2:C5").Borders.LineStyle = True End Sub
まぁ、格子罫線を引く機会も多いでしょうから、これはこれで便利です。では、セル範囲の外枠に罫線を引くには、どうしたらいいでしょう。実は、これも便利な仕組みがあります。それが「BorderAroundメソッド」です。これは読んで字のごとく、指定したセル範囲の外枠に罫線を引く専用のメソッドです。BorderAroundメソッドには、次のような引数が用意されています。
BorderAround (LineStyle, Weight, ColorIndex, Color, ThemeColor)
それぞれ、先に紹介したプロパティと同じ意味です。すべての引数が省略可能ですが、すべて省略してしまうと何も起こりませんので、引数LineStyleくらいは指定した方がいいでしょうね。
Sub Macro6() Range("B2:C5").BorderAround True End Sub
「太い実線」を引くのでしたら、次のように、引数Weightだけ指定すればいいです。
Sub Macro7() Range("B2:C5").BorderAround Weight:=xlThick End Sub
異なる種類の罫線を引くときには、注意が必要です。基本的に「後から引いた罫線に上書き」されます。たとえば、まず、太線の外枠を引いてから、中に格子罫線を引いてみます。
Sub Macro8() Range("B2:C5").BorderAround Weight:=xlThick ''太線の外枠 Range("B2:C5").Borders.LineStyle = True ''実線の格子 End Sub
先に引いた"太線"が、後から引いた"実線"で上書きされてしまいます。こんなときは、太線を後から引きます。
Sub Macro8() Range("B2:C5").Borders.LineStyle = True ''実線の格子 Range("B2:C5").BorderAround Weight:=xlThick ''太い外枠 End Sub
「罫線を引くマクロが苦手」というユーザーは多いです。しかし、罫線を引くこと自体は、ここまで解説したように、不要なコードを省略していけば、意外と簡単です。では、なぜ「罫線を引くマクロ」が難しいのでしょうか。それは、罫線を「どこに引くのか」という、対象のセル範囲を自動的に特定する部分です。はっきり言って、これ罫線とは関係ありません。セル範囲の操作(特定)です。たとえば、次のようなケースで考えてみましょう。
上図の表に罫線を引きます。言うまでもありませんが「データの件数は何行あるか分からない」ものとします。ここでは、罫線を引いた結果が分かりやすいように、1行目とA列を空け、さらにワークシートの枠線も非表示にしています。次のようにしてみましょう。
まず、表の中には格子罫線を引きます。表全体の外枠は太い罫線です。「名前」の列(B列)の右にも太い実線を引き、最終行の上には二重罫線を引きます。どうですか?よくあるパターンでしょう。格子罫線や外枠罫線の引き方は、上記で解説しました。「罫線を引く操作」自体は、それほど難しくありません。問題は、どうやって「表全体」や「B列」や「最終行」を特定するかです。たとえば、次のようにします。
Sub Macro9() With Range("B2").CurrentRegion .Borders.LineStyle = True .BorderAround Weight:=xlThick .Columns(1).Borders(xlRight).Weight = xlThick .Rows(.Rows.Count).Borders(xlEdgeTop).LineStyle = xlDouble End With End Sub
このマクロのポイントは、本稿のテーマである罫線ではなく、いかにしてセル範囲を操作するかです。なので、詳しい解説は、下記ページをご覧ください。
一般的なマクロでは「○○に対して××する」という処理が多いです。このとき「××する」に関しては、マクロ記録したり、あるいはネットを検索するなどすれば、意外と簡単に分かります。問題は「○○に対して」の"○○"つまり、操作の対象です。ここを指定することが難しいです。なぜなら、実務では"分からない"からです。この、分からないことを調べて、自動的に取得するというのは、どんなマクロにも共通する、最も基本的な技術です。ぜひ、がんばってスキルアップしてください。