見積書の雛形をエクセルVBAで作ろう!(Part 5)

見積書の雛形をエクセルVBAで作ろう!.png

罫線を引く

前回の「見積書の雛形をエクセルVBAで作ろう!(Part 4)」では行高さを変更していきました。今回は罫線を引いていきたいと思います。
今日書き込む部分もまた独立したSubプロシージャにしておきましょう。
名前は「罫線を引く」にしましょうか。 ↓

Sub罫線を引く1600×1200

罫線の引き方は?

皆さんエクセルで罫線を引いたことはありますか? セルを選択した状態で「セルの書式設定」を表示して設定しますよね。 画面はこんな感じです。 ↓

セルの書式設定(罫線)1600×900

これをVBAでは文字で表現して設定するわけです。

まず罫線を引きたいセル範囲を指定します。
B2セルであれば Range(“B2”)です。
左上がD2セルで右下がE3セルの範囲ならば Range(“D2:E3”)と書きます。

このRangeオブジェクト(指定したセル範囲)の数あるプロパティのうち、「.Borders」(罫線の場所を表すプロパティ)を使い、Bordersの後ろに続けてカッコで囲った「定数」を書いてどの場所かを指定します。場所指定した後に.LineStyle = xlContinuousとづづけて罫線を引きます。

Bordersプロパティの「定数」は下記の通りです。 ↓

xlDiagonalDown    範囲内の各セルの左上隅から右下への斜め線
xlDiagonalUp     範囲内の各セルの左下隅から右上への斜め線
xlEdgeBottom     範囲内の下側の横線
xlEdgeLeft      範囲内の左端の縦線
xlEdgeRight      範囲内の右端の縦線
xlEdgeTop       範囲内の上側の横線
xlInsideHorizontal  範囲の外周を除く、範囲内すべてのセルの横線
xlInsideVertical   範囲の外周を除く、範囲内すべてのセルの縦線

例えばB2セルの下辺を指定したい場合は
Range(“B2”).Borders(xlEdgeBottom).LineStyle = xlContinuous
と書きます。
Range(“D2:E3”).Borders.LineStyle = xlContinuous
というふうに「定数」を省略すると指定したセル範囲の縦線と横線すべてを指定したことになります。

左上がD2セルで右下がE3セルの範囲の外周を指定したい場合は、上下左右をすべて指定すると長いので BorderAroundというメソッド(命令文)を使います。メソッドを使う場合は最後の部分の書き方が変わり、ドット(.)を付けずに LineStyle:=xlContinuousと書きます。
Range(“D2:E3”).BorderAround LineStyle:=xlContinuous

逆に罫線を消したい場合は青塗りした部分を変えて
Range(“D2:E3”).Borders(xlEdgeBottom).LineStyle = xlLineStyleNone
と書きます。もちろん定数を省略すれば指定したセル範囲のすべての縦横罫線を消せます。
Range(“D2:E3”).Borders.LineStyle = xlLineStyleNone

罫線の線種を指定するには?

.LineStyle = xlContinuous で罫線を引きますが、このxlContinuousは「実線(細)」を指定しています。
「破線」や「一点鎖線」などを引きたい場合は下記の線種を指定します。 ↓

xlContinuous    実線(細)
xlDash       破線
xlDashDot      一点鎖線
xlDashDotDot    二点鎖線
xlDot        点線
xlDouble      二重線
xlSlantDashDot   斜め斜線
xlLineStyleNone   無し

例えば Range(“D2:E3”).Borders.LineStyle = xlDash で破線が引けます。

罫線の太さを指定するには?

罫線の太さを変えるには、引いてある罫線に対して「.Weight」プロパティを指定します。
罫線の太さには既定値(デフォルト値)があり指定しない場合はxlThin(細)が設定されます。
Weightプロパティの「定数」は下記の通りです。 ↓

xlHairline  極細
xlThin    細
xlMedium   中
xlThick    太

罫線が引いていない場所にいきなりRange(“D2:E3”).Borders.Weight = xlThickと書いた場合は線種の既定値(デフォルト値)であるxlContinuous(実線 細)が引かれます。

罫線の色を指定するには?

罫線の色を変えるには、引いてある罫線に対して「.color」プロパティを指定します。
何も引かれていないところにいきなり色指定のみを書いた場合は既定値(デフォルト値)のxlThin(細)とxlContinuous(実線 細)が設定されます。

WEBで検索すると色の指定にはいくつかの表現方法があるようですが、ここではなるべくオリジナルの色を再現という方針を取りたいのでRGB関数を使って指定することにします。
colorプロパティの指定のしかたは Range(“D2:E3”).Borders.Color = RGB(0,112,192) です。
これは青色になります。

実際に罫線を引いてみましょう

以上の決まりを踏まえて、実際にコードを書いていきましょう。

まず、セル範囲Range(“B2:H2”)の「下側の横線」に太線を引きます。
そして同じ範囲を再度指定して色をRGB(0,112,192)(青色)に変えます。 ↓

Range("B2:H2").Borders(xlEdgeBottom).Weight = xlThick
Range("B2:H2").Borders(xlEdgeBottom).Color = RGB(0, 112, 192)

なにも引かれていないところに太線指定のみで書きましたので
線種の既定値(デフォルト値)であるxlContinuous(実線 細)が引かれます。

ここでこの2行をよく見ると黄色と赤色のマーカー部分が全く同じですね。
同じものを何回も書くのはなるべく避けたいです。
この部分を短く纏めたいので先頭に変数の宣言を入れて工夫しましょう。

Bordersコレクション用の変数Bsと Borderプロパティ単体用の変数Bを宣言します。
よく見て纏められそうな部分を変数に代入して短いコードにします。

Dim Bs As Borders '罫線プロパティの集合体(コレクション)
'(データ型はオブジェクト型のBorders)
Dim B As Border '罫線プロパティ
'(データ型はオブジェクト型のBorder)

Set B = Range("B2:H2").Borders(xlEdgeBottom)
    B.Weight = xlThick
    B.Color = RGB(0, 112, 192)

あとは同じような繰り返しになりますので纏めて書きますね。こうなりました。 ↓

Sub 罫線を引く()

    Dim Bs As Borders  '罫線プロパティの集合体(コレクション)
                       '(データ型はオブジェクト型のBorders)
    Dim B As Border    '罫線プロパティ
                       '(データ型はオブジェクト型のBorder)

    Set B = Range("B2:H2").Borders(xlEdgeBottom)
        B.Weight = xlThick
        B.Color = RGB(0, 112, 192)
    Set B = Range("B5:D5").Borders(xlEdgeBottom)
        B.Weight = xlMedium
        B.Color = RGB(0, 112, 192)
    Range("B7:D7").Borders(xlEdgeBottom).Color = RGB(0, 112, 192)

    Range("B9:D11").BorderAround LineStyle:=xlContinuous
    Set Bs = Range("B9:D11").Borders
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    Range("B13:D14").BorderAround LineStyle:=xlContinuous
    Set Bs = Range("B13:D14").Borders
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    Range("B19:H19").Borders.Color = RGB(0, 112, 192)
    Range("B21:H32").Borders.Color = RGB(0, 112, 192)
    Range("G34:H36").Borders.Color = RGB(0, 112, 192)
    Range("B37:H42").Borders(xlInsideHorizontal).Color = RGB(0, 112, 192)
    Set Bs = Range("B19:H19").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    Set Bs = Range("B20:H36").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    Set Bs = Range("G34:H36").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    Set Bs = Range("B37:H42").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = RGB(0, 112, 192)
        Bs(xlEdgeBottom).Color = RGB(0, 112, 192)
        Bs(xlEdgeLeft).Color = RGB(0, 112, 192)
        Bs(xlEdgeRight).Color = RGB(0, 112, 192)
    
    
End Sub

短く纏めたいのですが、まだ繰り返しがありましたね! RGB(0, 112, 192) が何度も何度も出てきています。これも変数にして短くしてしまいましょうか。変数Cを追加してこのRGB関数をいれてみます。 ↓

Sub 罫線を引く()

    Dim Bs As Borders  '罫線プロパティの集合体(コレクション)
                       '(データ型はオブジェクト型のBorders)
    Dim B As Border    '罫線プロパティ
                       '(データ型はオブジェクト型のBorder)
    Dim C As Long      'RGB関数の値(データ型は長整数型のLong)
    
    C = RGB(0, 112, 192)   '青色を代入

    Set B = Range("B2:H2").Borders(xlEdgeBottom)
        B.Weight = xlThick
        B.Color = C
    Set B = Range("B5:D5").Borders(xlEdgeBottom)
        B.Weight = xlMedium
        B.Color = C
    Range("B7:D7").Borders(xlEdgeBottom).Color = C

    Range("B9:D11").BorderAround LineStyle:=xlContinuous
    Set Bs = Range("B9:D11").Borders
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    Range("B13:D14").BorderAround LineStyle:=xlContinuous
    Set Bs = Range("B13:D14").Borders
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    Range("B19:H19").Borders.Color = C
    Range("B21:H32").Borders.Color = C
    Range("G34:H36").Borders.Color = C
    Range("B37:H42").Borders(xlInsideHorizontal).Color = C
    Set Bs = Range("B19:H19").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    Set Bs = Range("B20:H36").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    Set Bs = Range("G34:H36").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    Set Bs = Range("B37:H42").Borders
        Bs(xlEdgeTop).Weight = xlMedium
        Bs(xlEdgeBottom).Weight = xlMedium
        Bs(xlEdgeLeft).Weight = xlMedium
        Bs(xlEdgeRight).Weight = xlMedium
        Bs(xlEdgeTop).Color = C
        Bs(xlEdgeBottom).Color = C
        Bs(xlEdgeLeft).Color = C
        Bs(xlEdgeRight).Color = C
    
End Sub

これが限界かな。。。
さあ、これを書き込んで今日書いた「罫線を引く」のSubプロシージャ内にカーソルを置いてからキーボードの「F5キー」または「Sub/ユーザフォームの実行」ボタンを1回押して実行してみてください。 ↓

カーソルを置くSub罫線を引く2 1600×1600

記入間違いがなければ罫線が引けるはずです。
今日のコードは長かったですね。お疲れさまでした!

次回はセルの結合とタイトルなどの書き込みをやっていきましょう。

タイトルとURLをコピーしました