【2026年7月最新】VBA Withステートメント完全ガイド|入れ子(ネスト)・Excel/Word実践例・エラー対処まで

【2026年7月最新】VBA Withステートメント完全ガイド|入れ子(ネスト)・Excel/Word実践例・エラー対処まで

「VBAのコードが長くなりすぎて、どこに何を書いたか分からない」——そんな悩みを解決してくれるのがWithステートメントです。

VBAで同じオブジェクトに対して複数のプロパティやメソッドを設定するとき、毎回オブジェクト名を繰り返し書くのは非常に手間がかかります。たとえば、ExcelのセルA1に対してフォント・サイズ・色・太字・下線をすべて指定しようとすると、Range("A1").Font.NameRange("A1").Font.SizeRange("A1").Font.Bold……と、何行もオブジェクト参照を繰り返すことになります。

Withステートメントを使えば、この繰り返しをまとめて省略できます。記述量が約40〜60%削減でき、コードの可読性が劇的に上がります。本記事では、Withの基本構文から、Excel/Word実践例・ネスト(入れ子)の正しい使い方・WithEventsキーワード・よくあるエラー対処まで、2026年7月最新の情報で完全解説します。

代表菅澤 代表菅澤
VBAでマクロを書き始めた人がまず覚えるべきテクニックのひとつがWithです。コードが整理されると、バグも見つけやすくなりますし、後から修正するときの工数も大幅に下がります。
AI鬼管理山崎 AI鬼管理山崎
VBA初心者のうちは「Withなしでも動くからいいや」と思いがちですが、実際に100行・200行のマクロを書くようになると、Withの有無でコードの管理しやすさが全然違ってきます。最初から習慣にしておくことをおすすめします。

この記事を読めば、次の内容が理解できます。

✔️VBA Withステートメントの仕組みとオブジェクト参照省略の原理
✔️Withなし・ありの具体的なコード比較で違いが一目瞭然
✔️Excel・Wordでの実践的なWith活用パターン
✔️ネスト(入れ子)の正しい書き方と間違いやすいポイント
✔️WithEventsキーワードを使ったイベント駆動プログラミングの基礎
✔️よくあるエラー(オブジェクト参照エラー)の原因と解決策
✔️With + Loopで大量セルを高速処理するテクニック
✔️Claude CodeにVBAコードを書かせる実践的プロンプト術
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBA Withステートメント完全ガイド|入れ子(ネスト)・Excel/Word実践例・エラー対処まで
VBAのWithステートメントを基礎から完全解説。Withなし/ありの比較・ネスト(入れ子)の使い方・Excelセル書式設定・WordVBA・WithEventsキーワード・よくあるエラー対処・Loopとの組み合わせまで。Claude CodeでVBAコードを自動生成する方法も紹介。

01 VBA Withステートメントとは コード省略の仕組みと記述量削減のメリットを理解する

VBAのWithステートメントは、同一のオブジェクトに対して複数のプロパティ設定やメソッド呼び出しをまとめて書くための構文です。With〜End Withブロックの内側では、オブジェクト名を省略して「.プロパティ名」や「.メソッド名」だけで記述できます。

📚 用語解説

Withステートメント:VBA(Visual Basic for Applications)における構文のひとつ。With オブジェクト名 〜 End With で囲まれたブロック内では、同じオブジェクトを繰り返し参照する際にオブジェクト名を省略できます。Excelマクロ・WordマクロなどOfficeアプリのVBAすべてで利用可能です。

Withステートメントが登場したのは、VBAの前身であるVisual Basicの時代から。長い歴史を持つ構文ですが、現在もExcel VBA・Word VBA・Access VBAなどすべてのOffice VBA環境で標準的に使われています。

1-1. Withが解決する「オブジェクト参照の繰り返し」問題

VBAでExcelのセル書式を設定する典型的なコードを見てみましょう。Withを使わない場合、次のように書きます。

vba
Sub WithNashiNo():
    Range("A1").Font.Name = "メイリオ"
    Range("A1").Font.Size = 14
    Range("A1").Font.Bold = True
    Range("A1").Font.Color = RGB(220, 38, 38)
    Range("A1").Font.Underline = xlUnderlineStyleSingle
    Range("A1").Interior.Color = RGB(255, 244, 244)
    Range("A1").HorizontalAlignment = xlCenter
End Sub

同じセル(Range("A1"))と同じオブジェクト(.Font)を7行繰り返しています。コードが冗長なうえ、対象セルを変更したいときに7箇所すべてを書き直す必要があります。

Withを使うと、これが次のようにスッキリします。

vba
Sub WithAriNo():
    With Range("A1").Font
        .Name = "メイリオ"
        .Size = 14
        .Bold = True
        .Color = RGB(220, 38, 38)
        .Underline = xlUnderlineStyleSingle
    End With
    With Range("A1")
        .Interior.Color = RGB(255, 244, 244)
        .HorizontalAlignment = xlCenter
    End With
End Sub

オブジェクト参照の繰り返しがなくなり、ひと目で「どのオブジェクトの設定をしているか」が分かる構造になりました。

1-2. Withのメリット3つ

✔️記述量の削減:オブジェクト参照を繰り返さないため、コード行数が約30〜60%減る。書く手間・読む手間の両方が下がる
✔️保守性の向上:対象オブジェクトを変更するときの修正箇所が1箇所(Withの行)だけになる。バグ混入リスクが下がる
✔️実行速度の改善:VBAのインタープリタがオブジェクト参照を解決する回数が減るため、プロパティを大量に設定する場面ではわずかに高速化が期待できる

📚 用語解説

インタープリタ:プログラムのコードを上から1行ずつ読み取って実行するプログラム。VBAはインタープリタ方式で動作するため、オブジェクト参照(Range("A1").Font など)を評価するたびに処理コストがかかります。Withを使うとオブジェクト参照の評価回数が減るため、高頻度処理でわずかながら速度向上が得られます。

AI鬼管理山崎 AI鬼管理山崎
Withは「書くのが楽になる」だけでなく、「後で読んだときにコードの意図が伝わりやすい」という効果も大きいです。チームで開発するときや、数ヶ月後に自分のコードを見直すときに、この差が実感できます。

02 Withなしとありのコード比較 同じ処理でどれだけ違うか、並べて見てみよう

「百聞は一見にしかず」ということで、同じ処理をWithなし・ありで並べて比較します。Withがどれほどコードをシンプルにするか、実際のコードで体感してください。

2-1. セル書式設定:Withなし vs あり

Excelのセル範囲に、背景色・フォント・枠線・配置をまとめて設定する例です。

Withなし(27行)

vba
Sub FormatWithout():
    ' セルA1:C5に書式設定(Withなし)
    Range("A1:C5").Interior.Color = RGB(255, 235, 235)
    Range("A1:C5").Font.Name = "游ゴシック"
    Range("A1:C5").Font.Size = 11
    Range("A1:C5").Font.Color = RGB(50, 50, 50)
    Range("A1:C5").Font.Bold = False
    Range("A1:C5").HorizontalAlignment = xlCenter
    Range("A1:C5").VerticalAlignment = xlCenter
    Range("A1:C5").WrapText = True
    Range("A1:C5").Borders(xlEdgeLeft).LineStyle = xlContinuous
    Range("A1:C5").Borders(xlEdgeLeft).Weight = xlThin
    Range("A1:C5").Borders(xlEdgeRight).LineStyle = xlContinuous
    Range("A1:C5").Borders(xlEdgeRight).Weight = xlThin
    Range("A1:C5").Borders(xlEdgeTop).LineStyle = xlContinuous
    Range("A1:C5").Borders(xlEdgeTop).Weight = xlThin
    Range("A1:C5").Borders(xlEdgeBottom).LineStyle = xlContinuous
    Range("A1:C5").Borders(xlEdgeBottom).Weight = xlThin
End Sub

Withあり(17行)

vba
Sub FormatWith():
    ' セルA1:C5に書式設定(Withあり)
    With Range("A1:C5")
        .Interior.Color = RGB(255, 235, 235)
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        With .Font
            .Name = "游ゴシック"
            .Size = 11
            .Color = RGB(50, 50, 50)
            .Bold = False
        End With
        With .Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
        End With
    End With
End Sub

Withを使うことで17行と約1/3短くなり、「A1:C5というセル範囲の設定をまとめている」という構造がひと目で分かるようになりました。

💡 コード行数削減の目安

Withを使うと、同一オブジェクトへの参照が5回以上ある場合に特に効果的です。3〜4回程度なら見た目の違いは小さいですが、10回以上になると記述量は半分以下になることもあります。

2-2. グラフ設定:Withなし vs あり

ExcelのグラフオブジェクトにもWithは非常に有効です。グラフのタイトル・軸・凡例などを設定する場面では特に恩恵が大きくなります。

Withなし

vba
Sub ChartFormatWithout():
    Dim cht As Chart
    Set cht = ActiveSheet.ChartObjects(1).Chart
    cht.HasTitle = True
    cht.ChartTitle.Text = "月別売上推移"
    cht.ChartTitle.Font.Size = 16
    cht.ChartTitle.Font.Bold = True
    cht.ChartTitle.Font.Color = RGB(30, 30, 30)
    cht.Axes(xlCategory).HasTitle = True
    cht.Axes(xlCategory).AxisTitle.Text = "月"
    cht.Axes(xlValue).HasTitle = True
    cht.Axes(xlValue).AxisTitle.Text = "金額(万円)"
    cht.Legend.Position = xlLegendPositionBottom
End Sub

Withあり

vba
Sub ChartFormatWith():
    With ActiveSheet.ChartObjects(1).Chart
        .HasTitle = True
        With .ChartTitle
            .Text = "月別売上推移"
            With .Font
                .Size = 16
                .Bold = True
                .Color = RGB(30, 30, 30)
            End With
        End With
        With .Axes(xlCategory)
            .HasTitle = True
            .AxisTitle.Text = "月"
        End With
        With .Axes(xlValue)
            .HasTitle = True
            .AxisTitle.Text = "金額(万円)"
        End With
        .Legend.Position = xlLegendPositionBottom
    End With
End Sub

グラフのような階層構造が深いオブジェクトでは、ネスト(入れ子)のWithを使うことで、コードの論理構造とオブジェクト階層が一致し、非常に読みやすくなります。

代表菅澤 代表菅澤
「Withなしで書いたコード」を見ると、どこで何の設定をしているのかを読み解くのに時間がかかります。Withありのコードは、構造がブロックで視覚的に分かるので、デバッグの時間が体感で半分以下になります。

03 Withの基本構文 End With・ネスト可能な構造を正しく理解する

Withステートメントの基本構文はシンプルです。ただし、正しく使うためにいくつかのルールを押さえておく必要があります。

3-1. 基本構文の形

vba
With オブジェクト
    .プロパティ1 = 値1
    .プロパティ2 = 値2
    .メソッド名 引数
    ' ...
End With

ポイントは3つです。

✔️Withの後ろにオブジェクトを指定する(変数でも直接参照でもOK)
✔️ブロック内では「.」(ドット)から書き始める(省略されているオブジェクト名の代わり)
✔️必ずEnd Withで閉じる(End Withがないとコンパイルエラー)

📚 用語解説

オブジェクト:VBAで操作できる「モノ」の総称。ExcelのRange(セル範囲)・Worksheet(シート)・Workbook(ブック)・Font(フォント)・グラフなどがオブジェクトです。各オブジェクトはプロパティ(属性)とメソッド(動作)を持ちます。

3-2. 変数にオブジェクトを格納してWithを使う

Withにはオブジェクト変数も使えます。長いオブジェクト参照を変数に格納してからWithブロックに渡すパターンは、コードの再利用性を高めます。

vba
Sub WithVariable():
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("売上データ")
    Set rng = ws.Range("B2:B100")

    With rng
        .Font.Bold = True
        .NumberFormat = "#,##0"
        .HorizontalAlignment = xlRight
        .Interior.Color = RGB(240, 249, 240)
    End With
End Sub
💡 変数+Withの組み合わせが最強

長いオブジェクトパス(例:ThisWorkbook.Sheets("売上").Range("A1"))を毎回書くのは誤りの元です。Setで変数に格納してからWithブロックで使うパターンが、最もメンテナンスしやすいVBAの書き方です。

3-3. ネスト(入れ子)の基本ルール

Withは入れ子(ネスト)にできます。外側のWithブロックの内側に、さらに別のWithブロックを書くことで、階層的なオブジェクト構造を整理して表現できます。

vba
Sub NestedWith():
    With ActiveSheet
        .Name = "集計シート"
        With .Range("A1")
            .Value = "売上合計"
            With .Font
                .Bold = True
                .Size = 14
                .Color = RGB(220, 38, 38)
            End With
        End With
    End With
End Sub

ネストのルールは「内側のEnd WithはFontを閉じ、その次のEnd WithはRangeを閉じ、最後のEnd WithはActiveSheetを閉じる」という順番になります。開いた順の逆に閉じるイメージです。

With ActiveSheet
With .Range("A1")
With .Font
End With(Font閉じ)
End With(Range閉じ)
End With(Sheet閉じ)
⚠️ End Withの対応関係に注意

Withをネストするときは、End WithがどのWithと対応しているかを意識してください。インデント(字下げ)を適切に使うと、対応関係が視覚的に分かりやすくなります。End Withが1つ多い・少ないとコンパイルエラーになります。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Excelでの実践例 セル書式・フォント・グラフをWithでまとめて設定する

ここからは実践的なコードを紹介します。Excelで最もよく使われるWithの活用パターンを、コピー&ペーストで使えるサンプルとして解説します。

4-1. セルの書式を一括設定する

Excelのセル書式設定は、Withと最も相性がよいユースケースのひとつです。フォント・背景色・配置・枠線をひとつのWithブロックにまとめましょう。

vba
Sub ExcelCellFormat():
    ' ヘッダー行(1行目)に見栄えよい書式を一括設定
    With Range("A1:F1")
        ' 背景色
        .Interior.Color = RGB(30, 64, 175)
        ' フォント設定
        With .Font
            .Name = "游ゴシック Medium"
            .Size = 12
            .Bold = True
            .Color = RGB(255, 255, 255)
        End With
        ' 配置
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .RowHeight = 32
        ' 枠線
        With .Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(255, 255, 255)
        End With
    End With
End Sub

ヘッダー行のデザインを変えたいときは、Range("A1:F1")の部分を1箇所変えるだけで全設定に反映されます。

4-2. 複数シートをWithで設定する

複数のシートに同じ設定を適用する場合もWithが便利です。

vba
Sub MultiSheetSetup():
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        With ws
            ' ページ設定
            With .PageSetup
                .Orientation = xlLandscape
                .PaperSize = xlPaperA4
                .FitToPagesWide = 1
                .FitToPagesTall = False
                .LeftMargin = Application.InchesToPoints(0.5)
                .RightMargin = Application.InchesToPoints(0.5)
                .TopMargin = Application.InchesToPoints(0.7)
                .BottomMargin = Application.InchesToPoints(0.7)
            End With
            ' 表示設定
            .DisplayGridlines = False
            .DisplayHeadings = False
            .Zoom = 100
        End With
    Next ws
End Sub
AI鬼管理山崎 AI鬼管理山崎
For Each + With の組み合わせは非常に強力です。「全シートに同じ設定を適用する」「全行の書式を統一する」といった一括処理で大活躍します。

4-3. グラフの見た目をWithで整える

グラフはオブジェクト階層が深いため、WithのネストによるコードがVBAらしい書き方になります。

vba
Sub GraphDesign():
    With ActiveSheet.ChartObjects(1).Chart
        ' チャートエリアのデザイン
        With .ChartArea
            .Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
            With .Format.Line
                .Visible = True
                .ForeColor.RGB = RGB(200, 200, 200)
                .Weight = 1
            End With
        End With
        ' プロットエリア
        With .PlotArea
            .Format.Fill.ForeColor.RGB = RGB(248, 249, 250)
        End With
        ' 凡例
        With .Legend
            .Position = xlLegendPositionBottom
            .Font.Size = 10
        End With
        ' タイトル
        With .ChartTitle
            .Text = "四半期売上比較"
            With .Font
                .Size = 14
                .Bold = True
            End With
        End With
    End With
End Sub

📚 用語解説

ChartObjects:Excelシートにあるグラフオブジェクトのコレクション。ChartObjects(1)で1番目のグラフを指定し、さらに.Chartプロパティでグラフ本体(Chart オブジェクト)にアクセスします。ChartオブジェクトはChartArea・PlotArea・Axes・Legendなど多くの子オブジェクトを持つため、Withネストが特に有効です。

05 Wordでの実践例 段落設定・フォント・スタイルをWithでまとめて指定する

WithステートメントはExcelだけでなく、Word VBAでも広く使われます。段落のインデント・スペーシング・フォントなど、Wordの書式設定はプロパティが多いため、Withの効果が特に大きい場面です。

5-1. 段落書式の一括設定

Wordの段落に対してインデント・行間・スペースをWithでまとめて設定する例です。

vba
Sub WordParagraphFormat():
    ' アクティブドキュメントの最初の段落を設定
    With ActiveDocument.Paragraphs(1)
        With .Format
            .SpaceBefore = 6
            .SpaceAfter = 6
            .LineSpacingRule = wdLineSpaceExactly
            .LineSpacing = 20
            .LeftIndent = InchesToPoints(0.5)
            .RightIndent = InchesToPoints(0.5)
            .FirstLineIndent = InchesToPoints(0)
            .Alignment = wdAlignParagraphJustify
        End With
        With .Range.Font
            .Name = "游明朝"
            .Size = 12
            .Bold = False
            .Color = RGB(40, 40, 40)
        End With
    End With
End Sub

5-2. 文書全体のスタイルをWithで一括変更

ビジネス文書全体のフォントとレイアウトをWithで設定する例です。複数の設定箇所をまとめることで、ドキュメントの一貫したデザインを効率よく維持できます。

vba
Sub WordDocumentSetup():
    Dim doc As Document
    Set doc = ActiveDocument

    With doc
        ' ページ設定
        With .PageSetup
            .PageWidth = CentimetersToPoints(21)
            .PageHeight = CentimetersToPoints(29.7)
            .TopMargin = CentimetersToPoints(3)
            .BottomMargin = CentimetersToPoints(2.5)
            .LeftMargin = CentimetersToPoints(2.5)
            .RightMargin = CentimetersToPoints(2)
        End With
        ' ドキュメントデフォルトフォント
        With .Styles(wdStyleNormal).Font
            .Name = "游明朝"
            .Size = 10.5
        End With
        With .Styles(wdStyleNormal).ParagraphFormat
            .LineSpacingRule = wdLineSpaceMultiple
            .LineSpacing = LinesToPoints(1.2)
            .SpaceAfter = 0
        End With
    End With

    MsgBox "文書の基本設定が完了しました。"
End Sub
代表菅澤 代表菅澤
Wordマクロは「繰り返し作業の自動化」で特に威力を発揮します。たとえば「毎月の報告書を同じデザインで出力する」作業をWithで書いておくと、スタイルを変えたいときに1箇所直すだけで済みます。
💡 Word VBAでWithを使うメリット

WordのDocumentオブジェクトはPageSetup・Styles・Sections・Paragraphsなど多くの子オブジェクトを持ちます。これらをネストのWithでまとめると、複雑なドキュメント設定でもコードが整理され、後から変更・再利用がしやすくなります。

06 ネスト(入れ子)の使い方と注意点 正しい書き方・間違えやすいポイントを完全攻略

Withのネストは「オブジェクトの階層に沿ってコードを入れ子にする」技法です。正しく使えば可読性が大幅に上がりますが、いくつかの落とし穴もあります。

6-1. ネストの基本パターン

ネストはWith〜End Withの中に、さらにWith〜End Withを書く形です。

vba
Sub NestingBasic():
    With ThisWorkbook.Sheets("Sheet1")       ' 外側: シートオブジェクト
        .Tab.Color = RGB(220, 38, 38)        ' シートのプロパティ

        With .Range("A1:E1")                 ' 中側: セル範囲オブジェクト
            .Merge                           ' セルを結合

            With .Font                       ' 内側: フォントオブジェクト
                .Name = "游ゴシック"
                .Size = 16
                .Bold = True
                .Color = RGB(255, 255, 255)
            End With                         ' Font を閉じる

            .Interior.Color = RGB(30, 64, 175)
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With                             ' Range を閉じる

        .Columns("A:E").AutoFit             ' シートのメソッド
    End With                                 ' Sheet1 を閉じる
End Sub

コードのコメントで示したように、内側のEnd WithがFontを閉じ、次のEnd WithがRangeを閉じ、最後のEnd WithがSheetを閉じるという順番になります。

6-2. 間違えやすいポイント:外側オブジェクトへの参照

ネストしたWithの中から、外側のWithオブジェクトにアクセスしたい場合、単純な「.プロパティ」では内側のWithが優先されてしまいます

vba
Sub NestingMistake():
    ' 間違いやすい例
    With Range("A1")
        With .Font
            .Name = "游ゴシック"
            ' ここで .Value = "テスト" と書いても、
            ' Font.Value を探してしまいエラーになる!
        End With
        .Value = "テスト"  ' Range("A1")のValueはここで書く
    End With
End Sub
⚠️ ネスト内で外側オブジェクトにアクセスするには

内側のWithブロック内では、外側のWithオブジェクトを直接「.プロパティ」で指定できません。外側オブジェクトにアクセスしたい場合は、End Withで内側を閉じてから書くか、変数に格納してから変数名で参照する必要があります。

6-3. ネストは3階層までが目安

Withのネストは理論上何階層でも可能ですが、3階層を超えると可読性が逆に下がることがあります。特に、4階層・5階層になると対応するEnd Withがどこかを把握しにくくなります。

✔️2〜3階層なら可読性が向上する。積極的に使うべき
✔️4階層以上になったら、中間オブジェクトを変数に格納してWithを分割することを検討する
✔️コメントで「どのWithを閉じているか」を明記すると、深いネストでも管理しやすい
1階層 With(外側)
2階層 With(中側)
3階層 With(内側)
<ここまでが推奨>
4階層以上は要検討
AI鬼管理山崎 AI鬼管理山崎
With のネストが4階層以上になってきたら「このコードは分割できないか?」を考えるサインです。処理をサブルーチンに分けて、シンプルな構造を保つ方が長期的なメンテナンスコストが下がります。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 WithEventsキーワード イベント駆動プログラミングへの応用

WithEventsは、Withステートメントとは別の用途を持つキーワードですが、名前に「With」が付くため混同されることが多いです。ここでは両者の違いと、WithEventsの使い方を解説します。

📚 用語解説

WithEvents:VBAでクラスモジュールまたはフォームモジュールのモジュールレベルで変数を宣言するときに使うキーワード。WithEventsで宣言したオブジェクト変数は、そのオブジェクトが発生させるイベントをコードで捕捉(ハンドリング)できるようになります。Withステートメント(書式省略)とは全く別の機能です。

7-1. WithEventsとWithステートメントの違い

項目WithステートメントWithEventsキーワード
用途同一オブジェクトへの参照を省略して記述オブジェクトのイベントを捕捉できる変数を宣言
書く場所プロシージャ内のコードモジュールの宣言セクション(Dim行)
End Withが必要か必要不要(Dim文のみ)
主な使用場面セル書式・グラフ・ページ設定などの一括指定Excelブック・シート・フォームのイベント処理

7-2. WithEventsの基本的な使い方

WithEventsの典型的な使い方は、クラスモジュール内で別のブックやシートのイベントを監視するパターンです。

vba
' クラスモジュール(例: Class1)内
Private WithEvents ExcelApp As Application

Private Sub Class_Initialize()
    Set ExcelApp = Application
End Sub

Private Sub ExcelApp_WorkbookOpen(ByVal Wb As Workbook)
    MsgBox "ブック「" & Wb.Name & "」が開かれました。"
End Sub

Private Sub ExcelApp_WorkbookBeforeSave(ByVal Wb As Workbook, _
    ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' 保存前に自動でバックアップを作成する例
    Wb.SaveCopyAs Wb.Path & "\backup_" & Format(Now, "yyyymmdd_hhnnss") & ".xlsx"
End Sub

上の例では、WithEvents ExcelApp As Applicationと宣言することで、Excelアプリケーション全体のイベント(ブックを開いたとき・保存するときなど)をクラスモジュール内で捕捉しています。

💡 WithEventsが使えるのはモジュールレベルのみ

WithEventsで宣言した変数はプロシージャ内では宣言できません(コンパイルエラーになります)。必ずモジュールの冒頭(宣言セクション)に書いてください。また、WithEventsが使えるのはクラスモジュール・ユーザーフォームモジュール・シートモジュール・Thisworkbookモジュールです。標準モジュールでは使えません。

7-3. WithEventsの実用例:シートの変更を監視する

シートモジュールに書く場合は、クラスの初期化が不要でよりシンプルに書けます。

vba
'シートモジュール(Sheet1)内
Private Sub Worksheet_Change(ByVal Target As Range)
    ' A列の値が変更されたときにB列に更新日時を自動入力
    If Not Intersect(Target, Columns("A")) Is Nothing Then
        Application.EnableEvents = False
        With Target.Offset(0, 1)
            .Value = Now
            .NumberFormat = "yyyy/mm/dd hh:mm"
        End With
        Application.EnableEvents = True
    End If
End Sub

このコードでは、Withステートメントを使って更新日時セル(Target.Offset(0,1))の値とフォーマットを一緒に設定しています。WithEventsとWithステートメントを組み合わせるのが実践的なVBAの書き方です。

08 よくあるエラーと対処法 With使用中のオブジェクト参照エラーを解決する

Withステートメントを使うときに発生しやすいエラーとその対処法を解説します。エラーが出たときのデバッグ手順もあわせて紹介します。

8-1. 実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません

最もよく見かけるエラーが「実行時エラー 91」です。このエラーはWithの対象オブジェクトがNothing(空)のときに発生します。

vba
Sub Error91Example():
    Dim ws As Worksheet
    ' Set文を忘れてWithを使う → エラー91
    With ws          ' ws は Nothing のまま → エラー!
        .Name = "テスト"
    End With
End Sub

解決策は、Withブロックの前に必ずSetでオブジェクトを格納することです。

vba
Sub Error91Fix():
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")  ' Setで格納

    If ws Is Nothing Then
        MsgBox "シートが見つかりません。"
        Exit Sub
    End If

    With ws
        .Name = "テスト"
    End With
End Sub

8-2. 実行時エラー424:オブジェクトが必要です

Withブロック内でドット(.)から始まらない行を書いた場合、意図せず外側のスコープの変数を参照しようとしてエラーになることがあります。

vba
Sub Error424Example():
    With Range("A1")
        .Value = "テスト"
        Interior.Color = RGB(255, 0, 0)  ' ← ドットが抜けている!
        ' .Interior.Color = ... が正しい
    End With
End Sub
⚠️ ドット(.)の書き忘れに注意

Withブロック内でプロパティを指定するとき、先頭のドット(.)を忘れると、Withのオブジェクトではなくモジュールレベルの変数などを参照しようとしてエラーになります。VBAエディタのオートインデントが正しく機能していれば見た目でわかることも多いですが、慣れるまでは意識的にドットの有無を確認してください。

8-3. Withブロック中に対象オブジェクトが変わるケース

Withブロックの実行中に、対象オブジェクトが変更・削除されると予期しない動作になることがあります。

vba
Sub WithObjectChanged():
    With ActiveCell
        .Value = "入力前"
        ActiveSheet.Cells(1, 1).Select  ' アクティブセルが変わる!
        .Font.Bold = True  ' 元のActiveCell(移動前)に適用されることに注意
    End With
End Sub
💡 対象オブジェクトを変数に格納して安全にする

WithにActiveCellやSelectionを直接渡すと、ブロック内で選択が変わった場合に意図しない動作が起きます。With ws.Range("A1") のように固定オブジェクトを指定するか、Setで変数に格納してから使うのが安全です。

8-4. デバッグ手順:Withエラーが出たときの確認チェックリスト

✔️WithのオブジェクトがNothingでないか確認する(If obj Is Nothing Then ...
✔️ブロック内のすべての行がドット(.)から始まっているか確認する
✔️End Withの対応関係が正しく閉じられているか確認する(ネスト時は特に注意)
✔️Withブロック内で対象オブジェクトの選択・移動が起きていないか確認する
✔️On Error Resume Nextを使っている場合は、エラーが隠れているかもしれないので一時的に外してテストする
代表菅澤 代表菅澤
VBAのエラーは最初は戸惑いますが、パターンが決まっています。エラー91の9割は「Setし忘れ」、エラー424の多くは「ドット抜け」です。この2つを押さえておくだけで、Withエラーのほとんどは対処できます。

09 With + Loop の組み合わせ 大量セル処理の高速化・For Each・Do Whileとの連携

WithステートメントとループをうまくQへ組み合わせると、大量のセルや行を効率よく処理できます。ここでは実際の業務で使える実践的なパターンを紹介します。

9-1. For Each + With:コレクションの各要素に同じ設定を適用

コレクション(Sheetsコレクション・Rangeコレクションなど)の各要素に、同じ設定を繰り返し適用するパターンです。

vba
Sub ForEachWith():
    Dim ws As Worksheet

    ' 全シートのヘッダー行を統一フォーマットに
    For Each ws In ThisWorkbook.Worksheets
        With ws.Rows(1)
            .RowHeight = 28
            With .Font
                .Name = "游ゴシック Medium"
                .Size = 11
                .Bold = True
                .Color = RGB(255, 255, 255)
            End With
            .Interior.Color = RGB(17, 94, 89)
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    Next ws

    MsgBox "全シートのヘッダーを更新しました。"
End Sub

9-2. For Next + With:行番号を使った大量行処理

For Nextループと組み合わせて、条件に応じたセル書式を大量行に適用する例です。

vba
Sub ForNextWith():
    Dim i As Long
    Dim lastRow As Long

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    ' 1000行のデータに交互の縞模様書式を適用
    Application.ScreenUpdating = False  ' 画面更新を止めて高速化

    For i = 2 To lastRow
        With Rows(i)
            If i Mod 2 = 0 Then
                .Interior.Color = RGB(240, 249, 240)  ' 偶数行:薄いグリーン
            Else
                .Interior.Color = RGB(255, 255, 255)  ' 奇数行:白
            End If
            With .Font
                .Name = "游ゴシック"
                .Size = 10
            End With
        End With
    Next i

    Application.ScreenUpdating = True
    MsgBox lastRow - 1 & " 行の書式設定が完了しました。"
End Sub
💡 ScreenUpdating = False で大幅高速化

ループ内でセルを大量に操作する場合、Application.ScreenUpdating = False を事前に実行すると画面の再描画を抑制して処理が格段に速くなります。処理後は必ず True に戻してください。With + Loop にこの設定を組み合わせると、数千行の処理も現実的な時間で完了します。

9-3. Do While + With:条件が続く間、動的なオブジェクトを処理

vba
Sub DoWhileWith():
    Dim i As Long
    i = 2  ' データ開始行

    Do While Cells(i, 1).Value <> ""
        With Cells(i, 1)
            ' A列の値に応じて背景色を変える
            Select Case .Value
                Case "完了"
                    .Interior.Color = RGB(209, 250, 229)
                    .Font.Color = RGB(6, 95, 70)
                Case "未着手"
                    .Interior.Color = RGB(255, 237, 213)
                    .Font.Color = RGB(154, 52, 18)
                Case "進行中"
                    .Interior.Color = RGB(219, 234, 254)
                    .Font.Color = RGB(30, 64, 175)
                Case Else
                    .Interior.Color = RGB(243, 244, 246)
                    .Font.Color = RGB(75, 85, 99)
            End Select
        End With
        i = i + 1
    Loop
End Sub
AI鬼管理山崎 AI鬼管理山崎
Do While + With の組み合わせは、「データの最終行まで自動で処理する」系のマクロで頻繁に登場します。このパターンを習得しておくと、業務効率化マクロの幅がかなり広がります。
Application.ScreenUpdating = False
ループ開始(For/Do While)
With でオブジェクト取得
.プロパティ設定
ループ終端へ
Application.ScreenUpdating = True
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 GENAI実運用のExcel自動化事例 With + Loop で業務マクロの作業工数を大幅削減した実例

ここでは、弊社株式会社GENAIが実際にVBAのWithステートメントを活用して業務を自動化した事例を紹介します。

10-1. 月次売上レポートの自動フォーマット(毎月3時間→8分に短縮)

弊社では毎月、複数のExcelシートからデータを集約して売上レポートを作成していました。以前はセル書式の設定・グラフの更新・ヘッダーの統一を手動で行っており、毎月1人が約3時間かけていました。

VBAのWithステートメントを活用したマクロを組んだ結果、同じ作業が8分程度で完了するようになりました。月間で約2.5時間の工数削減です。年間換算で30時間以上の削減になります。

vba
Sub MonthlyReportFormat():
    ' 月次レポートの全シートを一括フォーマット
    Dim ws As Worksheet
    Application.ScreenUpdating = False

    For Each ws In ThisWorkbook.Worksheets
        ' シートタブの色分け
        With ws
            Select Case ws.Name
                Case "サマリー": .Tab.Color = RGB(220, 38, 38)
                Case "広告費": .Tab.Color = RGB(30, 64, 175)
                Case "人件費": .Tab.Color = RGB(22, 163, 74)
                Case Else: .Tab.Color = RGB(107, 114, 128)
            End Select

            ' ヘッダー行の書式
            With .Rows(1)
                With .Font
                    .Name = "游ゴシック Medium"
                    .Size = 11
                    .Bold = True
                    .Color = RGB(255, 255, 255)
                End With
                .Interior.Color = RGB(30, 30, 30)
                .RowHeight = 30
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With

            ' 列幅の自動調整
            .Columns.AutoFit
        End With
    Next ws

    ' サマリーシートのグラフ更新
    With ThisWorkbook.Sheets("サマリー").ChartObjects(1).Chart
        With .ChartTitle
            .Text = Format(Date, "yyyy年m月") & "度 売上サマリー"
            .Font.Size = 14
        End With
    End With

    Application.ScreenUpdating = True
    MsgBox "月次レポートのフォーマットが完了しました。"
End Sub

10-2. 顧客リスト管理マクロ(条件付き書式を動的に適用)

営業チームが管理する顧客リストに、ステータス(商談中・成約・失注など)に応じた色分けを自動適用するマクロです。毎週月曜朝にマクロを実行することで、チーム全員がひと目でリストの状況を把握できるようになりました。

vba
Sub CustomerListColorCode():
    Dim lastRow As Long
    Dim i As Long

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Application.ScreenUpdating = False

    For i = 2 To lastRow
        With Rows(i)
            Select Case Cells(i, "F").Value  ' F列 = ステータス列
                Case "成約"
                    With .Interior
                        .Color = RGB(209, 250, 229)  ' 薄いグリーン
                        .Pattern = xlSolid
                    End With
                    .Font.Color = RGB(6, 95, 70)
                Case "失注"
                    With .Interior
                        .Color = RGB(254, 226, 226)  ' 薄いレッド
                        .Pattern = xlSolid
                    End With
                    .Font.Color = RGB(153, 27, 27)
                Case "商談中"
                    With .Interior
                        .Color = RGB(254, 249, 195)  ' 薄いイエロー
                        .Pattern = xlSolid
                    End With
                    .Font.Color = RGB(133, 77, 14)
                Case Else
                    With .Interior
                        .Color = RGB(249, 250, 251)  ' 薄いグレー
                        .Pattern = xlSolid
                    End With
                    .Font.Color = RGB(75, 85, 99)
            End Select
        End With
    Next i

    Application.ScreenUpdating = True
    MsgBox "顧客リストの色分けが完了しました(" & lastRow - 1 & "件)。"
End Sub

このマクロを導入した結果、「リストを見ただけで各案件の状況がわかる」という状態になり、週次ミーティングでの確認作業が半分以下の時間で完了するようになりました。

代表菅澤 代表菅澤
VBAマクロは「一度作れば何度でも使える」のが最大のメリットです。Withを使ってメンテナンスしやすいコードにしておくと、数ヶ月後に「この設定を変えたい」となったときも修正が1箇所で済みます。
VBA With 実務活用のポイント

最初は「Withなしで動くコードを書く」→「後からWithで整理する」という手順が習得しやすい。動くコードが先にあることで、Withへのリファクタリング前後で動作を比較できる。

💡 リファクタリングのコツ

既存のVBAコードをWithで整理する(リファクタリング)際は、まず同一のオブジェクト参照(Range("A1")など)を検索して、何回登場するか数えてみましょう。5回以上繰り返されていればWithに書き換える価値があります。

11 Claude CodeにVBA Withを書かせる方法 AIを使ったVBAコード自動生成の実践プロンプト集

VBAのWithステートメントを含むマクロコードを、毎回自分で一から書くのは時間がかかります。Claude Code(Anthropicが提供するAIコーディングエージェント)を活用すれば、業務要件を日本語で伝えるだけでWithを正しく使ったVBAコードを生成できます。

実際に弊社では、新しいExcelマクロの初稿はほぼすべてClaude Codeに生成させています。生成されたコードをベースに、業務の細かい条件を追加するという流れが最も効率的でした。

11-1. Claude Codeへの効果的なプロンプト例

Claude CodeにVBA Withコードを生成させるときは、「何をしたいか(目的)」「対象のオブジェクト(セル範囲・シート・グラフなど)」「設定したいプロパティ」を具体的に伝えると精度が上がります。

プロンプト例1:セル書式設定

ExcelのVBAで、セル範囲A1:G1をヘッダー行として書式設定するマクロを書いてください。
条件:フォントは游ゴシック・サイズ12・白・太字、背景色はRGB(17,94,89)、行高さ30、横・縦方向ともに中央揃え。
Withステートメントを活用してネストを使い、整理されたコードにしてください。

プロンプト例2:シート全体の書式統一

VBAで、ブック内の全シートに対してFor Each Worksheetループを使い、以下の処理を実行するマクロを書いてください。
①1行目を見出しとして色・フォントを設定 ②印刷設定でA4横向き・1ページに収める ③グリッド線と行列見出しを非表示にする。
Withのネストを適切に活用し、Application.ScreenUpdating = Falseで高速化してください。

プロンプト例3:エラー処理付きコード

ExcelのVBAで、指定されたシートが存在するか確認してからWithブロックでセル書式を設定するマクロを書いてください。
シートが見つからない場合はMsgBoxでエラーメッセージを表示してExit Sub。シートが見つかったらRange("A1:D10")のフォント・背景・枠線をWithで設定。
エラー91が発生しないよう、Is Nothing チェックを含めてください。

11-2. Claude Codeを使うメリット

Claude Codeは単にコードを生成するだけでなく、「なぜそのコードで動くか」の説明や「こうしたほうが良い」という改善提案もしてくれます。VBAの学習ツールとしても非常に有効です。

✔️業務要件を日本語で伝えるだけでOK:「ネストしたWithを使って」「高速化して」などの条件も指定できる
✔️エラー処理・コメントも同時生成:「エラー91が出ないように」と指示すれば、Is Nothingチェックも含めたコードが出る
✔️既存コードの改善提案:Withなしの既存コードを貼り付けて「Withを使ってリファクタリングして」と依頼できる
✔️バグ解析:「このコードで実行時エラー91が出る。原因と対処法を教えて」という使い方も有効
AI鬼管理山崎 AI鬼管理山崎
Claude CodeはVBAのデバッグにも使えます。エラーメッセージとコードを一緒に貼り付けて「このエラーの原因は?」と聞くだけで、大抵の問題はすぐに解決します。VBAを覚え始めの時期に特に重宝します。

11-3. Claude Codeでの具体的な操作手順

Claude Codeを起動
業務要件をプロンプトで入力
コード生成・確認
VBAエディタに貼り付け
テスト実行・修正
本番運用開始

Claude Codeを使うにはAnthropicのProプラン(月$20)以上の契約が必要です。追加料金なしでClaude Codeが使えるため、VBAコード生成に限らず、ビジネス全般の自動化・文書作成・データ分析まで幅広く活用できます

🏆
VERDICT
Claude に軍配
VBAのWithコードをゼロから書く時間を、Claude Codeへの依頼時間(5〜10分)に置き換えるだけで、生産性が大幅に向上する。

📚 用語解説

Claude Code:AnthropicのAIモデル「Claude」を活用したターミナル型AIコーディングエージェント。コードの生成・デバッグ・リファクタリングをチャット形式で依頼できる。VBAに限らず、Python・JavaScript・SQL・シェルスクリプトなど多様な言語に対応している。

弊社GENAIでは、Claude Codeを「もう1人の開発者」として位置づけて運用しています。VBAマクロの依頼・Excelフォーマットの統一・業務フロー自動化コードの作成まで、AIが初稿を出してエンジニアがレビューするという流れが定着しています。

代表菅澤 代表菅澤
VBAは学習コストが高いと思われがちですが、Claude Codeと組み合わせれば「動くコード」を即座に手に入れて、そこから学ぶことができます。「コードを書けないから自動化できない」という時代は終わっています。

よくある質問

Q. VBA With ステートメントはExcel以外でも使えますか?

A. はい、VBAを搭載しているすべてのOfficeアプリ(Word・Access・PowerPoint・Outlook)でWithステートメントが使えます。たとえばWordでは段落書式・ページ設定の一括指定、Accessではフォームコントロールの設定などにWithが活用されます。Officeアプリ間でコードを移植する際も、Withの使い方は同じです。

Q. With と End With の間に Exit Sub や GoTo を入れてもいいですか?

A. Exit Sub はWithブロックの途中に書くことができます。ただし、GoToでWithブロックの外にジャンプする場合は注意が必要です。GoToでWithブロックを途中でスキップすると、内部状態が不定になる可能性があります。基本的には「Withブロックには入る前に条件分岐し、ブロック内はシンプルな設定だけにする」設計が安全です。

Q. Withを使うとコードが速くなると聞きましたが本当ですか?

A. 大量のプロパティ設定では若干の高速化効果があります。理由は、VBAインタープリタがオブジェクト参照を評価する回数が減るためです。ただし現代のPCでは数ミリ秒の差に過ぎないことも多く、大きな速度改善が必要な場合はApplication.ScreenUpdating = FalseやApplication.Calculation = xlCalculationManualの方が効果的です。Withの主なメリットはあくまで「可読性の向上」と「保守のしやすさ」と考えてください。

Q. WithEventsとWithステートメントはどう違いますか?

A. まったく別の機能です。Withステートメント(With〜End With)は「同一オブジェクトへの参照を省略する構文」で、プロシージャ内で使います。一方のWithEventsは「オブジェクトのイベントを捕捉できる変数を宣言するキーワード」で、モジュールの宣言セクション(Dim行)に書きます。名前にWithが付いているため混同されますが、用途もコードを書く場所も異なります。

Q. ネストしたWithでEnd Withの数を間違えるとどうなりますか?

A. End Withが少ない(開いたままのWithが残る)場合は、コンパイル時に「End Withのないブロックです」というエラーが発生します。逆にEnd Withが多すぎる(対応するWithがない)場合も同様のコンパイルエラーになります。VBAエディタはWithとEnd Withの対応を自動チェックするため、実行前にデバッグ→コンパイルで事前確認できます。

Q. Claude CodeでVBAコードを生成する場合、Proプランで足りますか?

A. はい、Proプラン(月$20)でClaude Codeが利用でき、VBAコードの生成に十分な使用量があります。日常的にVBAマクロの生成・改善・デバッグをAIに依頼する程度であれば、Proプランで問題なく対応できます。ただし1日に大量のコード生成や複雑なプロジェクト全体の自動化を並行して行う場合は、Max 5xプラン(月$100)以上を検討するとよいでしょう。

まとめ:VBA With ステートメントをマスターして業務効率を上げよう

この記事では、VBAのWithステートメントについて基礎から実践まで徹底解説しました。

✔️Withの基本:With〜End Withで同一オブジェクトへの参照を省略し、コードの記述量を30〜60%削減できる
✔️Excel実践:セル書式・グラフ設定・シート書式をWithで整理すると保守性が大幅に上がる
✔️Word実践:段落書式・ページ設定などのWord VBAもWithが威力を発揮する
✔️ネスト:2〜3階層のネストを正しく使えば階層構造が視覚的に分かるコードになる
✔️WithEvents:Withとは別物。イベント駆動プログラミングでオブジェクトのイベントを捕捉するキーワード
✔️エラー対処:エラー91はSetし忘れ・エラー424はドット抜けが主な原因
✔️With + Loop:For Each / For Next / Do WhileとWithを組み合わせると大量行処理を効率化できる
✔️Claude Code活用:Withを使ったVBAコードの生成・デバッグ・リファクタリングをAIに任せることで工数を大幅削減できる

Withステートメントは、VBAを「動くコード」から「読みやすく・直しやすいコード」に進化させる第一歩です。まずは既存のマクロコードを見て、同じオブジェクト参照が繰り返されている箇所をWithに書き換えることから始めてみてください。

代表菅澤 代表菅澤
VBAの習得は最初の一歩が難しいですが、Withを使えるようになった時点でコードの質が明らかに変わります。業務効率化マクロに取り組むなら、ぜひClaude Codeも活用してみてください。コード生成の壁がなくなると、自動化アイデアをどんどん形にできるようになります。
AI鬼管理山崎 AI鬼管理山崎
「VBAは古い技術」という声もありますが、ExcelやWordが業務の中心である日本企業では、VBAの需要はまだまだ高いです。Withをはじめとするベストプラクティスを押さえたコードは、AIと組み合わせることでさらに強力な業務ツールになります。

Claude Codeについてさらに詳しく知りたい方は、弊社が提供するAI鬼管理(株式会社GENAI)のサービスページをご覧ください。VBAをはじめとする業務自動化の導入支援を行っています。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月18日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。