VBA では、With ステートメントを使うことで、オブジェクトのプロパティやメソッドを簡潔に記述 できます。
しかし、With を使わずにコードを書く方法 もあります。
本記事では、With を使わずに VBA のコードを書く方法と、そのメリット・デメリット を解説します。
目次
With ステートメントとは?
With を使うと、同じオブジェクトに対して複数回アクセスする場合にコードを簡潔に書ける ようになります。
✅ With を使ったコード(例)
Sub FormatCellsWithWith()
With Range("A1:A10")
.Font.Bold = True
.Font.Size = 12
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
📌 Range("A1:A10") を With でまとめることで、冗長なコードを回避!
📌 オブジェクトの指定を省略できるので、コードが短くなる!
With を使わない方法
With を使わずに記述するには、オブジェクト変数を使用する または 毎回オブジェクトを明示的に記述する 方法があります。
✅ With を使わないコード:毎回オブジェクトを明示
Sub FormatCellsWithoutWith1()
Range("A1:A10").Font.Bold = True
Range("A1:A10").Font.Size = 12
Range("A1:A10").Interior.Color = RGB(255, 255, 0)
End Sub
📌 毎回 Range("A1:A10") を記述!
📌 オブジェクト名が長い場合は冗長になる!
✅ With を使わないコード:オブジェクト変数を使用
Sub FormatCellsWithoutWith2()
Dim rng As Range
Set rng = Range("A1:A10")
rng.Font.Bold = True
rng.Font.Size = 12
rng.Interior.Color = RGB(255, 255, 0)
End Sub
📌 Set を使ってオブジェクトを変数に格納!
📌 rng を使うことで With なしでも簡潔に書ける!
With を使わないメリット・デメリット
✅ With を使わないメリット
| メリット | 説明 |
|---|---|
| コードが明示的で理解しやすい | With のネストが深くなると可読性が下がるが、明示的に書けばどのオブジェクトに対する操作か一目で分かる |
| デバッグしやすい | With の中のコードを途中で止めて確認できないが、明示的に書けば途中の処理を確認しやすい |
| 複数のオブジェクトに適用しやすい | With は1つのオブジェクトにしか適用できないが、変数を使えば柔軟に書き換えられる |
❌ With を使わないデメリット
| デメリット | 説明 |
|---|---|
| コードが長くなる | 毎回オブジェクトを明示すると、コードが冗長になりやすい |
| 処理が遅くなる場合がある | With を使うとオブジェクトの参照を最適化できるが、With を使わないと毎回オブジェクトを再参照するため、処理が遅くなる可能性がある |
| コードの統一性が崩れる | チーム開発では With を使うことが一般的なため、統一感がなくなることがある |
With を使わない場合のベストプラクティス
✅ Set を使ってオブジェクト変数を活用
Sub FormatCellsBestPractice()
Dim rng As Range
Set rng = Range("A1:A10")
With rng.Font
.Bold = True
.Size = 12
End With
rng.Interior.Color = RGB(255, 255, 0) ' With の外に出してもOK
End Sub
📌 フォントに関する設定は With を使い、他の設定は変数を直接使用!
📌 コードの可読性と効率を両立!
✅ ループで処理する場合の工夫
オブジェクト変数を使えば、With を使わなくても簡潔に書ける ことが多いです。
Sub FormatMultipleRanges()
Dim ws As Worksheet
Dim rng As Range
Set ws = ActiveSheet
For Each rng In ws.Range("A1:A10, C1:C10, E1:E10").Areas
rng.Font.Bold = True
rng.Font.Size = 12
rng.Interior.Color = RGB(255, 255, 0)
Next rng
End Sub
📌 複数の範囲をループ処理!
📌 変数 rng を使うことで With なしでも分かりやすい!
With を使わないほうが良いケース
| ケース | 理由 |
|---|---|
| デバッグしながら実行する場合 | With の中のオブジェクトを Debug.Print などで確認できないため、明示的に書いたほうが良い |
| 複数のオブジェクトを扱う場合 | With は1つのオブジェクトしか対象にできないため、複数オブジェクトを変数で管理するほうが効率的 |
| 処理速度を最適化したい場合 | With を使うと処理が速くなる場合があるが、オブジェクトの参照回数が少ない場合は With なしでも問題ない |
まとめ
| 方法 | メリット | デメリット |
|---|---|---|
With を使う | コードが短くなる / 処理が速くなる | デバッグしにくい / 可読性が下がることも |
With を使わない(オブジェクトを毎回明示) | 明示的で分かりやすい | コードが冗長になる |
| オブジェクト変数を使う | With の利便性を活かしつつ可読性も向上 | Set の管理が必要 |
💡 With を使わない方法を選ぶ際のポイント
✅ オブジェクトが1回しか使われないなら、With は不要!
✅ デバッグしながら実行する場合は、明示的に記述したほうが便利!
✅ 可読性を重視するなら、オブジェクト変数を活用!
VBA の With は便利な機能ですが、状況によっては使わないほうが良いケースもあります。