更新日:、 作成日:

VBA With 文の使い方

はじめに

Excel VBA マクロの With 文でオブジェクトを参照したり、入れ子にする方法とを紹介します。

With オブジェクト のようにして、. からオブジェクトを参照できます。

オブジェクトには参照型か構造体を指定できます。

With の中に With を入力して入れ子にできますが、わかりづらいので使用しません。

参照型については「クラス」をご覧ください。
構造体については「構造体」をご覧ください。

With

With オブジェクト のように入力し、改行して End With を入力します。

With の中に . を入力すると オブジェクト. を入力したことになります。変数を宣言しなくても、オブジェクトを何度も参照できるのが便利です。

オブジェクトには参照型か構造体を指定します。Sheet1 などのシートや、セルを表す Range、クラスなどがオブジェクトです。

With Range("A1")
    .Value = "Tips"              ' Range("A1").Value
    .Font.Color = RGB(255, 0, 0) ' Range("A1").Font.Color
End With

' 次のコードと同じ
Dim r As Range
Set r = Range("A1")
r.Value = "Tips"
r.Font.Color = RGB(255, 0, 0)

With の中にはオブジェクトを使用しないコードも入力できます。

With Range("A1")
    Range("B1").Value = .Value ' Range("A1").Value
    Debug.Print(.Address)      ' Range("A1").Address
    Debug.Print("関係ない")
End With

With の入れ子

With は入れ子にできます。ただしわかりづらいので通常は使いません。

' 入れ子にする
With Sheet1
    With .Range("A1") ' Sheet1.Range("A1")
        .Value = "Tips"              ' Sheet1.Range("A1").Value 
        .Font.Color = RGB(255, 0, 0) ' Sheet1.Range("A1").Font.Color 
    End With

    ' このようにもできますが、入れ子にする意味がない
    With Sheet1.Range("A1")
        .Value = "Tips"              ' Sheet1.Range("A1").Value 
        .Font.Color = RGB(255, 0, 0) ' Sheet1.Range("A1").Font.Color 
    End With
End With

' 入れ子にしない方が見やすい
With Sheet1.Range("A1")
    .Value = "Tips"
    .Font.Color = RGB(255, 0, 0)
End With

また With が長くなると、何のオブジェクトを参照しているのかわかりづらくなります。

With を使用しなければできない処理はありません。素直に変数を使用するのをオススメします。

' With を使わない
Dim cell As Range
Set cell = Range("A1")
cell.Value = "Tips"
cell.Font.Color = RGB(255, 0, 0)

' 変数名を短くすると見やすくなる
Dim r As Range
Set r = Range("A1")
r.Value = "Tips"
r.Font.Color = RGB(255, 0, 0)

高速化

With の良いところはオブジェクトの参照が 1 回で済みます。ほんのわずかに処理が速くなります。

' 通常のコード、3 回参照している
Dim cell As Range
Set cell = Range("A1")           ' 1
cell.Value = "Tips"              ' 2
cell.Font.Color = RGB(255, 0, 0) ' 3

' With のコード、1 回参照している
With Range("A1")                 ' 1
    .Value = "Tips"              
    .Font.Color = RGB(255, 0, 0) 
End With