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 オブジェクトと相性がとても良い
