更新日:、 作成日:

VBA セルの罫線を取得する (Range.Borders)

はじめに

Excel VBA マクロでセルの罫線を取得する方法を紹介します。

Range("B1").Borders または Cells(1, 2).Borders プロパティから、セル「B1」の罫線を取得できます。

Border.LineStyle プロパティから、罫線の種類を取得できます。罫線があるか判定もできます。

Border.Color プロパティから、罫線の色を取得できます。

罫線を引くには「セルに罫線を引く」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。

セルの罫線を取得する

Range の引数にセル名を指定すると、そのセルの罫線を取得できます。

セル「A1」の上下左右の罫線を取得するには Range("A1").Borders を入力します。上側の罫線を取得するには Range("A1").Borders(xlEdgeTop) を入力します。

Dim bs As Borders
Set bs = Range("A1").Borders ' 上下左右の罫線

Dim b As Border
Set b = Range("A1").Borders(xlEdgeTop)    ' 上側の罫線
Set b = Range("A1").Borders(xlEdgeBottom) ' 下側の罫線
Set b = Range("A1").Borders(xlEdgeLeft)   ' 左側の罫線
Set b = Range("A1").Borders(xlEdgeRight)  ' 右側の罫線

Cells の引数にセルの行と列の番号を指定すると、そのセルの罫線を取得できます。

行「2」、列「A」の罫線を取得するには Cells(2, 1).Borders を入力します。

Dim bs As Borders
Set bs = Cells(1, 1).Borders ' A1
Set bs = Cells(2, 1).Borders ' A2
Set bs = Cells(1, 2).Borders ' B1
Set bs = Cells(2, 2).Borders ' B2
その他の辺の罫線を取得するには「セルの罫線について」をご覧ください。

隣接するセルの罫線は同じものです。セル「A1」の下側に罫線を引くと、セル「A2」の上側に罫線が引かれたことになります。

罫線の種類を取得する

Borders または Border の LineStyle から罫線の種類を取得できます。

Dim bs As Borders
Set bs = Range("B2").Borders ' 上下左右の罫線
Debug.Print(bs.LineStyle)

Dim b As Border
Set b = Range("B2").Borders(xlEdgeTop) ' 上側の罫線
Debug.Print(b.LineStyle)

罫線の種類には次のものがあります。

定数名 説明
xlContinuous1実線1
xlDash-4115破線2
xlDashDot4一点鎖線3
xlDashDotDot5二点鎖線4
xlDot-4118点線5
xlDouble-4119二重線6
xlSlantDashDot13斜め斜線7
xlLineStyleNone-4142なし

Borders.LineStyle から取得するときは、上下左右のすべての罫線の種類が同じときだけ値を取得します。違う種類が含まれているときは Null になります。

罫線の色を取得する

Borders または Border の Color から罫線の色を取得できます。

Dim l As Long
l = Range("B2").Borders.Color ' 上下左右の罫線の色
Debug.Print(l)

l = Range("B2").Borders(xlEdgeTop).Color ' 上側の罫線の色
Debug.Print(l)

取得した色は「RGB 関数」と同じ形式の値です。

Borders.Color から取得するときは、上下左右のすべての色が同じときだけ値を取得します。違う色が含まれているときは 0 になります。

罫線の太さを取得する

Borders または Border の Weight から罫線の太さを取得できます。

Dim bs As Borders
Set bs = Range("B2").Borders ' 上下左右の罫線
Debug.Print(bs.Weight)

Dim b As Border
Set b = Range("B2").Borders(xlEdgeTop) ' 上側の罫線
Debug.Print(b.Weight)

罫線の太さには次のものがあります。

定数名 説明
xlHairline1極細8
xlThin29
xlMedium-413810
xlThick411

Borders.Weight から取得するときは、上下左右のすべての罫線の太さが同じときだけ値を取得します。違う太さが含まれているときは Null になります。

セルの範囲の罫線を取得する

セルの範囲「A1」~「B2」の罫線を取得するには Range("A1:B2").Borders または Range("A1", "B2").Borders を入力します。

Dim bs As Borders
Set bs = Range("A1:B2").Borders    ' A1 ~ B2 のすべての上下左右の罫線
Set bs = Range("A1", "B2").Borders ' A1 ~ B2 のすべての上下左右の罫線
Debug.Print(bs.LineStyle)
Debug.Print(bs.Weight)

Dim b As Border
Set b = Range("A1:B2").Borders(xlEdgeTop)    ' A1 と B1 の上側の罫線
Debug.Print(b.LineStyle)
Set b = Range("A1:B2").Borders(xlEdgeBottom) ' A2 と B2 の下側の罫線
Debug.Print(b.LineStyle)

セルの範囲の Borders から各プロパティの値を取得するときは、範囲内の各セルの上下左右のすべての値が同じときだけ取得します。違う値が含まれているときは 0 または Null になります。

xlEdgeTop など辺を指定すると、範囲全体のその辺の値がすべて同じときだけ取得します。違う値が含まれているときは 0 または Null になります。

罫線があるか判定する

セルの上下左右に罫線が引かれているか判定するには Borders.LineStyle が xlLineStyleNone かどうかを調べます。

各辺に罫線が引かれているか判定するには Border.LineStyle が xlLineStyleNone かどうかを調べます。

Dim ls As Variant
ls = Range("B2").Borders.LineStyle               ' 上下左右の罫線
ls = Range("B2").Borders(xlEdgeTop).LineStyle    ' 上側の罫線
ls = Range("B2").Borders(xlEdgeBottom).LineStyle ' 下側の罫線
ls = Range("B2").Borders(xlEdgeLeft).LineStyle   ' 左側の罫線
ls = Range("B2").Borders(xlEdgeRight).LineStyle  ' 右側の罫線

If ls = xlLineStyleNone Then
    Debug.Print("なし")
Else
    Debug.Print("罫線あり")
End If

別シートのセルの罫線を取得する

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim bs As Borders
' Sheet1 のセル「A1」の罫線を取得
Set bs = Worksheets("Sheet1").Range("A1").Borders
Set bs = Worksheets(1).Range("A1").Borders
Debug.Print(bs.LineStyle)

' Sheet2 のセル「A1」の罫線を取得
Set bs = Worksheets("Sheet2").Range("A1").Borders
Set bs = Worksheets(2).Range("A1").Borders
Debug.Print(bs.LineStyle)

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"