ExcelVBAでは、同一のオブジェクトに対して複数の処理を行う時、「With」ステートメントを使用してオブジェクト名の記述を省略することができます。
コードの記述量を減らすことができたり、オブジェクト名が変更になった場合に修正にかかる手間を省くことができたりと、効率的に作業が行えるようになる便利な方法です。
今回の記事では、Withステートメントの使い方について詳しく解説していきますので、ぜひ参考にしてみてください!
VBAのWithステートメントとは?
Withステートメントは、ExcelVBAで使用できる構文の一種です。
同一のオブジェクトに対して複数の処理を行う時、Withステートメントでそのオブジェクトに対する処理を囲うことで、オブジェクト名を省略して記述をまとめることができます。
Withステートメントを使用する際は、次のような形式でコードを記述します。
【基本構文】
With 対象のオブジェクト名
.処理1
.処理2
...
End With
このように、本来は「.(ドット)」の前に記述しなければいけないオブジェクト名を、Withステートメントで囲うことで省略することができます。
オブジェクト名が変更になった時も、ステートメントの隣に記述したコードを修正するだけで済むため、効率が良くなるだけでなくミスの削減にも繋がります。
Withステートメントの使い方
Withステートメントの使い方について、サンプルコードと共に見ていきましょう。
例えば、次のようなコードがあるとします。
【サンプルコード1】
Sub sample()
Worksheets("Sheet1").Cells(1, 1).Font.Color = vbRed
Worksheets("Sheet1").Cells(1, 1).Font.Size = 20
Worksheets("Sheet1").Cells(1, 1).Font.Bold = True
Worksheets("Sheet1").Cells(1, 1).Font.Underline = xlUnderlineStyleSingle
End Sub
Fontオブジェクトを使用し、セルの文字色やサイズなどの書式変更を行っています。
処理ごとに基準となるオブジェクトを記述するだけでもかなりの量があり、コード自体も煩雑として見えるため、あまり可読性が高くありません。
このコードを、Withステートメントを使用して記述し直してみましょう。
【サンプルコード2】
Sub sample()
With Worksheets("Sheet1").Cells(1, 1).Font
.Color = vbRed
.Size = 20
.Bold = True
.Underline = xlUnderlineStyleSingle
End With
End Sub
Withステートメントで記述をまとめることで、すっきりと見やすい印象になったかと思います。
全体のコードが簡潔になっただけでなく、1つのブロックとして処理をまとめることで、どのオブジェクトに対応しているのかが視覚的にも明確になっています。
コードの可読性に関しては処理内容にもよるため、反対にデメリットとなり得るケースもありますが、上記のようなコードは使用に適している一例と言えるでしょう。
Withで複数のオブジェクトを指定したい場合はどうする?
操作したいオブジェクトが複数ある場合に、Withステートメントを入れ子(ネスト)状態で記述することもできます。
詳しい使い方について見ていきましょう。
Withを入れ子(ネスト)で使う
例えば、同一のワークシート内で、セルごとに複数の処理を行うといったケースがあるとします。
セルごとにWithステートメントのブロックを完全に分けて記述する方法も勿論ありますが、入れ子状態に記述することで、類似する処理を1つのブロックにまとめることもできます。
以下のサンプルコードを見てみましょう。
【基本構文】
Sub sample()
With Worksheets("Sheet1").Cells(1, 1)
With .Font
.Color = vbRed
.Size = 15
.Bold = True
End With
With .Interior
.Color = vbCyan
.Pattern = xlVertical
End With
End With
End Sub
同一のセルに対して、セルの書式に関する処理と背景に関する処理を、それぞれWithステートメントでまとめています。
入れ子にせず、オブジェクトごとに処理を完全に分ける場合は、次のようなコードになります。
【サンプルコード2】
Sub sample()
With Worksheets("Sheet1").Cells(1, 1).Font
.Color = vbRed
.Size = 15
.Bold = True
End With
With Worksheets("Sheet1").Cells(1, 1).Interior
.Color = vbCyan
.Pattern = xlVertical
End With
End Sub
どちらの方が見やすいかと感じるかは、見る人や内容によって変わるかと思いますので、状況に応じて管理のしやすい方で記述するといいでしょう。
Withの中で条件分岐させたい場合はどうする?
セルの値によって文字色を変化させたりなど、処理内容を条件分けしたいケースもあるでしょう。
Withステートメント内で条件分岐を行う場合の記述方法についても説明していきます。
WithとIfを組み合わせて使う
通常のコードと同じように、Withステートメント内でもIfステートメントを使用することができます。
以下のサンプルコードを見てみましょう。
【サンプルコード】
Sub sample()
With Worksheets("Sheet1").Cells(1, 1)
If .Value = "出席" Then
.Font.ColorIndex = 3
.Interior.ColorIndex = 0
ElseIf .Value = "欠席" Then
.Font.ColorIndex = 1
.Interior.ColorIndex = 15
End If
End With
End Sub
If文を使用して、セルの値に応じて文字色と背景色を変更しています。
Withステートメント内にコードを記述しているため、If文においてもオブジェクト名を省略することができています。
Withブロック変数のエラーが出た場合の対処法
Withステートメントを使用した際に、「実行時エラー ‘91’: オブジェクト変数またはWithブロック変数が設定されていません」というエラーメッセージが出ることがあります。
このエラーが発生する要因として最も多いのが、Setステートメントを付け忘れているケースです。
例えば、以下のサンプルコードのように、変数に一旦オブジェクトを格納してから処理を行おうとしたとします。
【サンプルコード】
Sub sample()
Dim cell As Range
cell = Worksheets("Sheet1").Cells(1, 1)
With cell.Font
.ColorIndex = 3
.Bold = True
End With
With cell.Interior
.ColorIndex = 20
.Pattern = xlGray8
End With
End Sub
このコードを実行しようとすると、上記のエラーが発生します。
変数にオブジェクトを格納する際は、変数名の前に必ずSetステートメントを付けるようにしましょう。
【正しい実装例】
Sub sample()
Dim cell As Range
Set cell = Worksheets("Sheet1").Cells(1, 1)
With cell.Font
.ColorIndex = 3
.Bold = True
End With
With cell.Interior
.ColorIndex = 20
.Pattern = xlGray8
End With
End Sub
まとめ
いかがでしたか?
Withステートメントは、コードを簡潔に記述する上で有用なツールの1つになります。
ぜひ、使い方を覚えて活用してみてくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Rangeでセルを範囲選択する方法を解説
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。