VBAで同じセルやシートに対して複数の処理を行う場合、毎回同じオブジェクトを繰り返し書いているとコードが長くなりメンテナンスもしにくくなります。これを解消するのが With ステートメントです。
この記事では、With〜End With の基本的な使い方をセルとシートの例で解説します。
Withステートメントの使い方とは?
With の横にオブジェクトを一度指定すると、End With までの間はそのオブジェクトを省略して .(ドット)だけで続きのプロパティやメソッドを書けます。
With オブジェクト
.プロパティ = 値
.メソッド
End With
同じセルに複数の書式を設定するには?
セルA1に背景色・文字色・罫線をまとめて設定する例です。
Withなし(オブジェクトを毎回書く)
Cells(1, 1).Interior.Color = RGB(0, 0, 0)
Cells(1, 1).Font.Color = RGB(255, 255, 255)
Cells(1, 1).Borders.LineStyle = xlContinuous
Withあり(すっきり)
With Cells(1, 1)
.Interior.Color = RGB(0, 0, 0) ' 背景色を黒に
.Font.Color = RGB(255, 255, 255) ' 文字色を白に
.Borders.LineStyle = xlContinuous ' 罫線を引く
End With
Cells(1, 1) の指定が1回で済み、コードが短くなります。後からセルのアドレスを変更する場合も1か所だけ直せばよいため修正ミスも防げます。
同じシートに複数の操作をまとめるには?
シートの名前・タブ色・セルへの入力をまとめて処理する例です。
With Sheets(1)
.Name = "一覧" ' シート名を設定
.Tab.Color = RGB(200, 200, 200) ' タブを灰色に
.Cells(1, 1).Value = "データ" ' A1セルに入力
End With
Sheets(1) を1回だけ書けば、その中の操作がすべて同じシートに対して実行されます。
まとめ
With オブジェクト〜End Withでオブジェクトを1回だけ指定してまとめて操作できる- 同じオブジェクトへの操作が2回以上あるときに使うとコードが短くすっきりする
- セル・シート・ワークブックなどあらゆるオブジェクトに使える
- 修正時にオブジェクトの指定が1か所だけで済むため変更ミスが減る
- 可読性・保守性の向上に直結する実務でよく使われる構文
よくある質問
Withの中でWithを入れ子にできますか?
できます。外側の With のオブジェクト内にある別のオブジェクトに対してさらに With を使えます。ただし深くなりすぎると読みにくくなるため、2〜3段程度が実用的な範囲です。
WithとSetで変数に代入する方法はどう使い分けますか?
同じオブジェクトを離れた場所で何度も参照する場合は Set 変数 = オブジェクト が便利です。1か所にまとまった操作を書く場合は With が適しています。場面に応じて使い分けましょう。
Withの中でIfやForを使えますか?
使えます。With〜End With の中に If〜End If や For〜Next を入れることができます。ただし End With と End If・Next の対応が崩れないよう、インデントを正しく書くことが大切です。
Withを使うと処理速度は変わりますか?
オブジェクトの参照回数が減るため、特に大量のプロパティ操作では若干の速度改善が期待できます。ただし体感できるほどの差が出るのは処理回数が多い場合に限られます。主な目的は可読性・保守性の向上と考えるのがよいです。
.(ドット)を書き忘れるとどうなりますか?
その作業は「迷子」になってしまいます。 たとえば With Sheets(1) と書いているのに、その中で .Name ではなく Name と書いてしまうと、VBAは「えっ、どの名前のこと?」と混乱したり、今たまたま開いている別の場所を操作しようとしたりします。「ドットは、Withで指定した相手とつながっている印」だと覚えましょう。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



