VBA を使ってコードを書く際、同じオブジェクトに何度もアクセスすることがよくあります。
そんなときに便利なのが、With
ステートメント です。
With
を使うことで、コードをシンプルにし、処理の高速化や可読性向上が可能 になります。
本記事では、Excel VBA における With
ステートメントとは何か、基本的な使い方、メリット・デメリット、応用例 について解説します。
目次
With ステートメントとは?
With
ステートメントは、特定のオブジェクトに対する複数のプロパティやメソッドを簡潔に記述するための構文 です。
通常、オブジェクトのプロパティを設定するには、オブジェクト名を毎回書く必要がありますが、With
を使うと 一度の指定で複数のプロパティをまとめて設定 できます。
With ステートメントの基本構文
With オブジェクト
.プロパティ1 = 値
.プロパティ2 = 値
.メソッド
End With
📌 With
の中では .
(ドット)を使ってオブジェクトのプロパティやメソッドを記述可能!
📌 処理対象のオブジェクトを With
でまとめることで、コードを簡潔に!
With の基本的な使い方
✅ セルのフォーマットを設定する
Sub FormatCells()
With Range("A1:A10")
.Font.Bold = True
.Font.Size = 12
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
📌 Range("A1:A10")
に対して、フォントの太字、サイズ、背景色をまとめて設定!
📌 With
を使うことで Range("A1:A10")
の記述を省略できる!
【VBA】With ステートメントで発生するエラーの原因と対策
✅ シートの印刷設定
Sub SetPrintSettings()
With ActiveSheet.PageSetup
.Orientation = xlLandscape ' 横向き
.PaperSize = xlPaperA4 ' A4サイズ
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End Sub
📌 シートの印刷設定を With
でまとめて記述!
📌 個別に書くよりシンプルで、修正も簡単!
【Excel】印刷でヘッダーを固定する方法【表のタイトルを各ページに表示】
✅ グラフの設定
Sub FormatChart()
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects(1)
With chartObj.Chart
.ChartTitle.Text = "売上データ"
.HasLegend = True
.Legend.Position = xlLegendPositionBottom
End With
End Sub
📌 グラフのタイトルや凡例の設定を With
でまとめることで、可読性向上!
With ステートメントのメリット・デメリット
【VBA】With を使わない方法とそのメリット・デメリット
✅ With を使うメリット
メリット | 説明 |
---|---|
コードが短くなる | With を使うことで、オブジェクト名の繰り返し記述を省略可能 |
可読性が向上する | どのオブジェクトに対して操作しているのか明確になる |
処理が高速化する | With を使うと、オブジェクトの参照回数が減り、処理が速くなる |
メンテナンスがしやすい | オブジェクト名を一箇所で指定するため、修正が楽 |
❌ With を使うデメリット
デメリット | 説明 |
---|---|
深いネストは可読性を下げる | With の中に With を入れると、どのオブジェクトに対する操作かわかりにくくなる |
途中の変数を Debug.Print で確認しにくい | With の中では、途中のプロパティを確認しづらい |
オブジェクトが Nothing の場合エラーになる | With の対象オブジェクトが存在しないとエラーが発生する |
With を使うときの注意点
✅ With の中で他のオブジェクトを扱わない
With
の中で Cells
や Range
など 別のオブジェクトを指定すると、With
の対象とは異なるオブジェクトになる ので注意。
Sub IncorrectUsage()
With Range("A1:A10")
.Font.Bold = True
Cells(1, 1).Value = "テスト" ' ❌ 別のオブジェクトになってしまう
End With
End Sub
📌 Cells(1,1)
は With
の Range("A1:A10")
とは無関係なオブジェクト!
📌 別のオブジェクトを扱う場合は、With
の外で処理する!
✅ オブジェクトが存在するか確認する
With
の対象オブジェクトが Nothing
だった場合、エラーになるので事前に確認すると安全。
Sub SafeWithUsage()
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Sheets("対象シート")
On Error GoTo 0
If ws Is Nothing Then
MsgBox "シートが見つかりません!", vbExclamation
Exit Sub
End If
With ws
.Range("A1").Value = "データ"
End With
End Sub
📌 事前にオブジェクトが存在するか確認すれば、エラーを防げる!
With の応用:ネスト(入れ子)
With
の中に With
を入れることで、さらに詳細な設定が可能。
Sub NestedWithExample()
With Range("A1:A10")
.Interior.Color = RGB(255, 255, 0)
With .Font
.Bold = True
.Size = 12
.Color = RGB(255, 0, 0)
End With
End With
End Sub
📌 With
の中で .Font
をさらに With
でまとめると、分かりやすく整理できる!
【VBA】With ステートメントの入れ子(ネスト)の方法と活用例
まとめ
項目 | 内容 |
---|---|
With の目的 | オブジェクトのプロパティやメソッドを簡潔に記述するため |
基本構文 | With オブジェクト ... End With |
メリット | コードの簡潔化、処理速度向上、可読性向上 |
デメリット | ネストしすぎると可読性低下、デバッグしにくい |
安全な使い方 | Set でオブジェクトを明示し、存在確認を行う |