VBAで自動化 VBAテクニック集 VBA一覧 Withステートメント 文法・構文

【VBA】With を使わない方法とそのメリット・デメリット

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 でまとめることで、冗長なコードを回避!
📌 オブジェクトの指定を省略できるので、コードが短くなる!

【VBA】ネスト(入れ子)とは

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 なしでも分かりやすい!

【VBA】セルの値を取得:ループ処理

With を使わないほうが良いケース

ケース理由
デバッグしながら実行する場合With の中のオブジェクトを Debug.Print などで確認できないため、明示的に書いたほうが良い
複数のオブジェクトを扱う場合With は1つのオブジェクトしか対象にできないため、複数オブジェクトを変数で管理するほうが効率的
処理速度を最適化したい場合With を使うと処理が速くなる場合があるが、オブジェクトの参照回数が少ない場合は With なしでも問題ない

まとめ

方法メリットデメリット
With を使うコードが短くなる / 処理が速くなるデバッグしにくい / 可読性が下がることも
With を使わない(オブジェクトを毎回明示)明示的で分かりやすいコードが冗長になる
オブジェクト変数を使うWith の利便性を活かしつつ可読性も向上Set の管理が必要
💡 With を使わない方法を選ぶ際のポイント

オブジェクトが1回しか使われないなら、With は不要!
デバッグしながら実行する場合は、明示的に記述したほうが便利!
可読性を重視するなら、オブジェクト変数を活用!

VBA の With は便利な機能ですが、状況によっては使わないほうが良いケースもあります。

【VBA】複数オブジェクトをWithステートメントで処理する方法

    -VBAで自動化, VBAテクニック集, VBA一覧, Withステートメント, 文法・構文