VBA では、With ステートメントを使うことで、同じオブジェクトのプロパティやメソッドを簡潔に記述 できます。
さらに、With の中に With を入れ子(ネスト)にする ことで、複雑なオブジェクトの操作を効率化 することが可能です。
本記事では、VBA における With の入れ子の書き方、活用例、メリット・デメリット を解説します。
目次
With ステートメントの基本
With を使うと、オブジェクトのプロパティを簡潔に記述できます。
✅ With の基本構文
With オブジェクト
.プロパティ1 = 値
.プロパティ2 = 値
.メソッド1
End With
📌 同じオブジェクトに対する操作を With でまとめると、記述が簡潔になる!
【VBA】複数オブジェクトをWithステートメントで処理する方法
With の入れ子(ネスト)の基本
あるオブジェクトの プロパティやメソッドがさらに別のオブジェクトを参照している場合、With の中に With を入れることが可能です。
✅ With を入れ子にする基本構文
With オブジェクト1
.プロパティ1 = 値
.プロパティ2 = 値
With .プロパティのオブジェクト
.プロパティA = 値
.プロパティB = 値
End With
End With
📌 ネスト(入れ子)を使うことで、オブジェクトの階層構造を簡潔に記述!
【VBA】Withステートメント内でMe(自分自身)キーワードの使用方法
With の入れ子の活用例
✅フォントとセルの書式設定を With の入れ子で設定
Sub FormatCellsNestedWith()
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 の入れ子で効率的に記述!
📌 With Range("A1:A10") の中で .Font を With でさらにまとめる!
【VBA】With ステートメントの中に If 文を入れる方法と活用例
✅ヘッダーとフッターの設定
Sub SetHeaderFooter()
With ActiveSheet.PageSetup
With .CenterHeader
.Text = "会社名 - レポート"
End With
With .CenterFooter
.Text = "作成日: &[Date] ページ &[Page] / &[Pages]"
End With
End With
End Sub
📌 PageSetup の Header や Footer の設定を With で入れ子に!
📌 可読性が向上し、どこを設定しているのかが分かりやすい!
【Excel】印刷でヘッダーを固定する方法【表のタイトルを各ページに表示】
✅グラフのフォーマットを With の入れ子で設定
Sub FormatChartWithNestedWith()
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects(1)
With chartObj.Chart
.ChartTitle.Text = "売上データ"
With .Axes(xlCategory)
.HasTitle = True
.AxisTitle.Text = "月"
End With
With .Axes(xlValue)
.HasTitle = True
.AxisTitle.Text = "売上金額"
End With
End With
End Sub
📌 Chart 内の Axes を With でまとめ、さらに AxisTitle も With でネスト!
📌 グラフのタイトルや軸のフォーマットを分かりやすく整理!
【VBA】Exit Forの入れ子(ネスト)する方法:For文
With の入れ子(ネスト)のメリット・デメリット
✅ メリット
| メリット | 説明 |
|---|---|
| コードの可読性が向上 | 同じオブジェクトのプロパティやメソッドを簡潔に記述できる |
| 処理速度が向上 | With を使うと VBA がオブジェクトを一度だけ参照するため、処理が速くなる |
| コードが短くなる | 変数を使わずにオブジェクトのプロパティを階層的に設定可能 |
❌ デメリット
| デメリット | 説明 |
|---|---|
| ネストが深くなると可読性が下がる | With の階層が増えると、どのプロパティを設定しているのか分かりにくくなる |
| デバッグが難しくなる | With 内のオブジェクトの途中経過を Debug.Print で確認しにくい |
| 意図しないオブジェクトに適用される可能性 | With の範囲を誤ると、意図しないオブジェクトのプロパティが変更されることがある |
With の入れ子を使う際のベストプラクティス
✅深いネストを避ける
' ❌ ネストが深くて読みにくい
With Range("A1:A10")
With .Font
With .Bold
' ここまで深くすると分かりにくい
End With
End With
End With
📌 3階層以上のネストは避けるのがベスト!
✅適切なコメントを入れる
Sub FormatCellsWithComments()
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
📌 どの部分を設定しているのか、コメントを適切に入れると可読性が向上!
✅変数を使ってネストを避ける
Sub FormatCellsWithVariable()
Dim rng As Range
Set rng = Range("A1:A10")
With rng
.Interior.Color = RGB(255, 255, 0)
.Font.Bold = True
.Font.Size = 12
.Font.Color = RGB(255, 0, 0)
End With
End Sub
📌 オブジェクト変数を使うと、With のネストを減らせる!
まとめ
| 項目 | ポイント |
|---|---|
With の入れ子の活用 | 同じオブジェクト内のプロパティを簡潔に記述 |
| メリット | 可読性向上・処理速度向上・コードの短縮 |
| デメリット | 深すぎると可読性が低下・デバッグしづらい |
| ベストプラクティス | 深いネストを避ける・コメントを入れる・変数を活用 |