🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の罫線 — コードでセルの罫線を引く(そしてブロック全体が枠で囲まれてしまう理由)

|

Excel VBA の罫線 — コードでセルの罫線を引く(そしてブロック全体が枠で囲まれてしまう理由)

TL;DR — 罫線は、セルではなく のプロパティです。範囲にはアドレス指定できる罫線が 8 本あります。4 つの外周の辺(xlEdgeLeftxlEdgeRightxlEdgeTopxlEdgeBottom)、2 組の 内側のグリッド線(xlInsideVerticalxlInsideHorizontal)、そして 2 本の対角線です。素の Range("A1:D10").Borders コレクションは そのすべて を指すので、.Borders.LineStyle = xlContinuous は外枠だけでなく、ブロック内のすべてのセルを囲みます。外枠だけが欲しいときは Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThin を使いましょう。

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
' ブロックを外枠で囲み、次にヘッダー行の下に細い罫線を引く - 別々の 2 つの仕事。
ws.Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous

罫線を引くこと — それは、たいていの人が最初に自動化する作業の 1 つであり、同時に、書式設定の 道具箱全体の中で、ちょっとした誤解が最も頭を悩ませる結果を生む場所でもあります。あなたは 「罫線を 1 本」お願いしたのに、Excel はすべてのセルの周りにグリッドを描いたのです。本記事は、 残りを予測可能にする 1 つの考えを軸に組み立てられています。Borders は辺のコレクションであり、 コレクションに触れることは、すべての辺に触れることだ。 罫線を辺ごとのものとして見られるように なれば、外枠か格子かという混乱は消えます。

この記事で学べること

  • 考え方の軸 — 罫線は辺に属し、Borders はその全部の集合
  • 最も大事なルール — .Borders はすべてのセルを囲み、.BorderAround は外枠だけを描く
  • 線を見えるようにする 3 つのプロパティ — LineStyleWeightColor
  • xlEdgeBottomxlInsideVertical などで一度に 1 辺ずつアドレス指定する
  • xlLineStyleNone で罫線をきれいに消す
  • 罫線が構造ではなく装飾である理由 — そして代わりに何に手を伸ばすか

考え方の軸:罫線は辺のプロパティ

これは見た目クラスターの兄弟です — Font はテキストをスタイルづけ、 Interior はその背後を塗り、そして罫線はその 周りに線を 引きます。 でも罫線は、1 つの重要な点でそれらと違います。セルは「罫線を 1 本」持つのではなく、最大 8 本 持ち、VBA はそのそれぞれに、XlBordersIndex 定数で添字づけした Borders コレクションを通じて 届きます。

' どの範囲にもアドレス指定できる 8 本の辺:
'   xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlEdgeBottom   - 4 つの外周の辺
'   xlInsideVertical, xlInsideHorizontal              - セルの「間」のグリッド線
'   xlDiagonalDown, xlDiagonalUp                       - 対角線 (角から角へ)
ws.Range("B2").Borders(xlEdgeBottom).LineStyle = xlContinuous   ' B2 の下辺だけ

この絵を頭に留めてください — 8 本の辺、そのそれぞれが独立にアドレス指定できる — そうすれば、 この先のどのルールもその帰結です。内側の罫線は、範囲が複数のセルにまたがるときにだけ存在します (1 つのセルには「間」がありません)。同じ 1 行のコードが B2B2:E20 とで違う振る舞いを するのは、まさにこのためです。

最も大事なルール:.Borders はすべての辺、.BorderAround は外枠だけ

誰もがつまずくのがこの 1 行です。複数セルの範囲では、コレクション を設定すると、すべての辺に 一度に効きます — 外周の辺 セルの間のグリッド線の両方にです。

' ブロック内の すべての セルを囲む - 外枠に加えて、内側のグリッド線もすべて。
ws.Range("A1:D10").Borders.LineStyle = xlContinuous

「罫線を付けて」と言うとき、人が意味しているのはめったにこれではありません。ブロック全体を囲む 1 つの長方形が欲しくて、内側には何もいらないなら、BorderAround メソッド を使いましょう。 これは常に 4 つの外周の辺にしか触れません。

' 外枠だけ - 内側の線はなし。
ws.Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThick

この区別がトピックの核心です。.Borders は格子、.BorderAround は外枠。 もし本当に両方が 欲しいなら — 内側を薄い線にした、枠で囲まれたブロック — 2 回に分けて行います。内側には .Borders.LineStyle を設定し、その上に重ねる太い枠には BorderAround を使います。 .BorderAround のつもりで .Borders に手を伸ばすこと — それが、「罫線 1 本」のはずが檻まるごとに なって出てくる、第 1 位の理由です。

線を作る 3 つのプロパティ:LineStyle・Weight・Color

罫線の辺は、LineStyle を持つまでは見えません。それが線をオンにするプロパティで、あとの 2 つは それを微調整します。ふつうは 3 つを一度に設定するので、With を使えば 読みやすさが保てます。

With ws.Range("A1:D10").Borders(xlEdgeBottom)
    .LineStyle = xlContinuous   ' 線を オン にする - これがないと何も表示されない
    .Weight = xlMedium          ' xlHairline, xlThin, xlMedium, xlThick
    .Color = RGB(0, 32, 96)     ' 24 ビット RGB、Font.Color と同じ
End With

知っておく価値のある点が 3 つ。LineStyle はオン/オフのスイッチで — xlContinuousxlDashxlDotxlDashDotxlDoublexlSlantDashDot など — これを設定することが罫線を現す動作です。 Weight は 4 つの定数(xlHairlinexlThinxlMediumxlThick)のいずれかであって、 ポイント数ではありません。そして LineStyleWeight のあらゆる組み合わせが正当なわけでは ありません。xlHairline は連続した細い線を含意し、xlDoubleWeight を完全に無視します — なので、太さが効いていないように見えるなら、線のスタイルがそれを上書きしているのです。色には .Color = RGB(r, g, b)VBA Font で扱った Font.Color と同じ 24 ビットの 空間)を使い、従来のパレットに合わせるのでない限り .ColorIndex は避けましょう。

一度に 1 辺ずつ

現実の罫線のほとんどは「全部か無か」ではありません。ヘッダーの下の罫線、2 つのセクションの間の 仕切り、太い左の余白 — そのどれもが 1 本の辺です。

' ヘッダーの下に太い線、B 列と C 列の間に薄い仕切り。
ws.Range("A1:D1").Borders(xlEdgeBottom).Weight = xlThick
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous
ws.Range("C2:C20").Borders(xlEdgeLeft).LineStyle = xlDot

xlInsideVerticalxlInsideHorizontal は、外枠なしでセルの のグリッド線を与えてくれます — BorderAround のちょうど逆です。欲しい辺をアドレス指定して、残りは手つかずのままにしましょう。 各 Borders(index) は独立しているので、下辺を設定しても上辺は決して乱されません。

罫線を消す

罫線を取り除くには、線のスタイルを none に設定します。コレクションに対してならすべてを消し、 1 つの添字に対してならその辺だけを消します。

ws.Range("A1:D10").Borders.LineStyle = xlLineStyleNone   ' ブロック内のすべての罫線を消す
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone   ' ヘッダーの罫線だけを消す

ここでは xlLineStyleNonexlNone は互換です。注意すべきは、範囲の罫線を消しても、Excel が テーブルスタイルや条件付き書式の一部として描く罫線には触れ ない ことです。それらは、セルでは なく、それを作ったオブジェクトが所有しています。なので、線がどうしても消えないなら、迷子の Borders 呼び出しではなく、テーブルや書式ルールを探しましょう。

罫線は装飾であって、構造ではない

はっきり言っておく価値があります。やり直しを減らせるからです。罫線は純粋に見た目のものです。 行をグループ化せず、範囲を定義せず、どの数式からも見えません。あとで参照できるように、ブロックを テーブルの ように見せる ために罫線を引いているなら、代わりに本物の Excel テーブル (ListObject)に変換しましょう — 枠で囲まれた見た目 に加えて、名前付き範囲、構造化参照、 自動の縞模様が手に入ります。手描きの罫線は、これから印刷したり書き出したりするレポートの仕上げに 使うものであって、コードが読める形をデータに与える手段ではありません。形は、 VBA Range でそうであるように、データの中に宿らなければなりません。罫線は、 その上に乗せたペンキにすぎません。

ExcelMaster の活用

罫線は、見た目以上に多くの判断を隠しています。コレクションか BorderAround か、8 本の辺のうち 本当はどれのつもりだったのか、LineStyle が静かに上書きする Weight、そしてテーブルが所有して いるせいで消えない線。どの選択を間違えても静かです — 外枠が欲しかったのに格子、あるいは まったく変化なし。

ExcelMaster なら、代わりに結果を 説明するだけで済みます。「集計ブロックを太い外枠で囲んで、ヘッダーの下に細い線を引いて」と言えば、 枠には BorderAround を、罫線には Borders(xlEdgeBottom) を使い — 線が実際に表示されるよう先に LineStyle を設定し、それに合わせて WeightColor を選びます。ブックもコードもあなたの手元に 残り、外枠だけが欲しかったすべてのセルを .Borders が檻に閉じ込めてしまう、あの一幕を飛ばせます。

よくある質問

Excel VBA で範囲に罫線を追加するには?

範囲全体を囲む 1 つの外枠なら、Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThin を使います — これは外周の枠だけを描きます。特定の 1 辺なら、コレクションの添字に 対して設定します。たとえば Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous です。 罫線を見えるようにするのは線のスタイルなので、(Weight だけでなく)常に LineStyle を設定 しましょう。

Range.Borders.LineStyle が 1 本の外枠ではなく、すべてのセルを囲むのはなぜ?

Range.Borders が辺のコレクション全体 — 4 つの外周の辺 セルの間の内側のグリッド線 — だから です。コレクションに LineStyle を設定するとそのすべてに効くので、複数セルの範囲はどのセルの 周りにも罫線が付きます。外周の枠だけに触れるには BorderAround を使うか、一度に 1 辺ずつ Borders(xlEdgeTop) のように個々の辺をアドレス指定しましょう。

VBA の Borders と BorderAround の違いは?

Borders(index) は辺(xlEdgeLeftxlInsideVertical など)で添字づけするコレクションで、素の コレクションを設定するとすべての辺に効きます。BorderAround は、1 回の呼び出しで範囲の 4 つの 外周の辺だけを描き、内側のグリッド線には触れないメソッドです。外枠には BorderAround を、内側の 線や 1 辺だけが必要なときには Borders コレクションを使いましょう。

VBA で範囲から罫線を消すには?

線のスタイルを none に設定します。Range("A1:D10").Borders.LineStyle = xlLineStyleNone はブロック 内のすべての罫線を消し、Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone は 1 辺 だけを消します。罫線がどうしても消えないなら、おそらく Excel のテーブルスタイルか条件付き書式の ルールが描いたもので、それらは自分の罫線を自分で所有しています。

VBA の罫線で使える LineStyle と Weight の値は?

LineStylexlContinuousxlDashxlDotxlDashDotxlDashDotDotxlDoublexlSlantDashDotxlLineStyleNone を受け取ります。Weight は 4 つの定数 — xlHairlinexlThinxlMediumxlThick — のいずれかであって、ポイントサイズではありません。一部の 組み合わせには制約があります。xlDoubleWeight を無視するので、太さが効いていないように 見えるなら、その理由は線のスタイルです。

検証環境

動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-14。

関連ガイド: VBA Merge Cells · VBA Cell Color · VBA Font · VBA With · VBA Range