Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - With構文

Excel VBA VBA
スポンサーリンク

With 構文は「同じ相手に、まとめて命令を出すための“会話モード”」

まずイメージからいきます。
With 構文は「同じオブジェクトに対して、何回も続けて命令を出したいときに使う“まとめモード”」です。

たとえば、A1 のフォントをいじりたいとき、素直に書くとこうなります。

Range("A1").Font.Name = "メイリオ"
Range("A1").Font.Size = 14
Range("A1").Font.Bold = True
Range("A1").Font.Color = vbBlue
VB

全部「Range(“A1”).Font」が繰り返されていますよね。
これを With 構文で書くと、こうなります。

With Range("A1").Font
    .Name = "メイリオ"
    .Size = 14
    .Bold = True
    .Color = vbBlue
End With
VB

「この With の間は、相手はずっと Range(“A1”).Font だよ」と宣言して、
中では「.Name」「.Size」のように“ドットから先だけ”を書いていくイメージです。


With 構文の基本形と「ドットの意味」

With の基本構文

形はとてもシンプルです。

With 対象オブジェクト
    .プロパティ1 =
    .プロパティ2 =
    .メソッド1 ~
End With
VB

ここで大事なのは、「.(ドット)」の意味です。
With の中のドットは、「さっき With で指定した相手に対して」という意味になります。

さっきの例で言うと、

With Range("A1").Font
    .Name = "メイリオ"   ' = Range("A1").Font.Name
    .Size = 14           ' = Range("A1").Font.Size
    .Bold = True         ' = Range("A1").Font.Bold
End With
VB

という対応になっています。

「With で“誰に話すか”を決めて、
中では“その人に対して”ドットから先だけ書く」
という会話のイメージを持つと、すっと入ります。


Excel オブジェクトでの典型パターン:Range とその中のプロパティ

Interior(背景色)をまとめて設定する

Sub SampleWithInterior()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    With ws.Range("A1:C3").Interior
        .Color = vbYellow
        .Pattern = xlSolid
    End With

End Sub
VB

ここでは、

対象オブジェクト:ws.Range("A1:C3").Interior
中の .Color, .Pattern は、全部その Interior に対する設定

という構造です。

もし With を使わないと、こうなります。

ws.Range("A1:C3").Interior.Color = vbYellow
ws.Range("A1:C3").Interior.Pattern = xlSolid
VB

同じものを何度も書かなくてよくなるので、
コードが短くなるだけでなく、「何をまとめていじっているか」が一目で分かります。

Borders(罫線)をまとめて設定する

Sub SampleWithBorders()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    With ws.Range("A1:C5").Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .Color = vbBlack
    End With

End Sub
VB

「この範囲の罫線をまとめて設定しているんだな」というのが、
With を見た瞬間に分かります。


With 構文の“おいしいところ”をちゃんと意識する

1つ目:同じものを何度も書かなくていい(読みやすさ・ミス防止)

例えば、こういうコードを想像してください。

ws.Range("A1").Font.Name = "メイリオ"
ws.Range("A1").Font.Size = 14
ws.Range("A1").Font.Bold = True
ws.Range("A1").Font.Color = vbBlue
VB

途中で「A1」を「B1」に変えたくなったら、4行全部を直さないといけません。
With を使っていれば、ここだけ変えれば済みます。

With ws.Range("B1").Font
    .Name = "メイリオ"
    .Size = 14
    .Bold = True
    .Color = vbBlue
End With
VB

「対象を1か所で指定して、あとはドットだけ」
これは、修正ミスを減らすための強力な武器になります。

2つ目:「今、何をいじっているのか」が一目で分かる

With の行を見れば、「このブロックは何を対象にしているのか」がすぐ分かります。

With ws.Range("A1:C5").Borders
    .LineStyle = xlContinuous
    .Weight = xlThin
End With
VB

この3行を見ただけで、

「入力シートの A1:C5 の罫線を設定しているんだな」

と分かりますよね。
これがバラバラに書かれていると、頭の中で「どこをいじっているのか」を毎回組み立て直さないといけません。


With の中で「さらに中のオブジェクト」を触ることもできる

Range に対して、Value と Font と Interior をまとめていじる

Sub SampleWithRangeAll()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    With ws.Range("A1")
        .Value = "タイトル"
        .Font.Bold = True
        .Font.Size = 16
        .Interior.Color = vbYellow
    End With

End Sub
VB

ここでは、

With の対象は Range(“A1”)
その中で .Value, .Font, .Interior を順番にいじっている

という構造です。

.Font.Bold は「(Range(“A1”)).Font.Bold」
.Interior.Color は「(Range(“A1”)).Interior.Color」
という意味になります。

「このセルに関することを、このブロックで全部やる」
という書き方ができるので、処理のまとまりが見えやすくなります。


With 構文を使うときに意識してほしい重要ポイント

「With の対象は“1つのオブジェクト”」を意識する

With の後ろに書くのは、必ず“1つのオブジェクト”です。

With ws.Range("A1").Font
    .Bold = True
    .Size = 14
End With
VB

ここでの対象は「ws.Range(“A1”).Font」という1つのオブジェクト。
中の .Bold, .Size は、全部その Font に対する操作です。

逆に、こういうのは NG です。

With ws.Range("A1"), ws.Range("B1")   ' こういう書き方はできない
VB

「誰に話しかけているか」を1人に決める、というイメージを持ってください。

「どこからどこまでが“その相手への会話”か」を意識する

With ~ End With のブロックは、「この相手に対する会話のまとまり」です。

With ws.Range("A1:C5").Borders
    .LineStyle = xlContinuous
    .Weight = xlThin
End With
VB

この3行は、「A1:C5 の罫線をこうする」という1セット。
この“まとまり感”が、コードの読みやすさを一段上げてくれます。


まとめ:With 構文は「同じ相手に、何度も命令するときの“省エネ会話モード”」

With の本質は、

「同じオブジェクトに対して、連続してプロパティ設定やメソッド呼び出しを行うときに、
そのオブジェクト名の繰り返しを省きつつ、“ここからここまでこの相手”と明示する構文」

です。

押さえておきたいポイントをコンパクトにまとめると、

With 対象 ~ End With の間の「.○○」は、全部その対象への操作
同じオブジェクト名を何度も書かなくてよくなり、修正ミスも減る
「このブロックは何をいじっているか」が一目で分かるので、読みやすさが上がる
Range、Font、Interior、Borders など、Excel オブジェクトと相性がとても良い

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