【2026年7月最新】VBA Withステートメント完全ガイド|入れ子(ネスト)・Excel/Word実践例・エラー対処まで
この記事の内容
「VBAのコードが長くなりすぎて、どこに何を書いたか分からない」——そんな悩みを解決してくれるのがWithステートメントです。
VBAで同じオブジェクトに対して複数のプロパティやメソッドを設定するとき、毎回オブジェクト名を繰り返し書くのは非常に手間がかかります。たとえば、ExcelのセルA1に対してフォント・サイズ・色・太字・下線をすべて指定しようとすると、Range("A1").Font.Name・Range("A1").Font.Size・Range("A1").Font.Bold……と、何行もオブジェクト参照を繰り返すことになります。
Withステートメントを使えば、この繰り返しをまとめて省略できます。記述量が約40〜60%削減でき、コードの可読性が劇的に上がります。本記事では、Withの基本構文から、Excel/Word実践例・ネスト(入れ子)の正しい使い方・WithEventsキーワード・よくあるエラー対処まで、2026年7月最新の情報で完全解説します。
この記事を読めば、次の内容が理解できます。
01 WHAT IS WITH 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を使わない場合、次のように書きます。
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を使うと、これが次のようにスッキリします。
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つ
📚 用語解説
インタープリタ:プログラムのコードを上から1行ずつ読み取って実行するプログラム。VBAはインタープリタ方式で動作するため、オブジェクト参照(Range("A1").Font など)を評価するたびに処理コストがかかります。Withを使うとオブジェクト参照の評価回数が減るため、高頻度処理でわずかながら速度向上が得られます。
02 BEFORE / AFTER Withなしとありのコード比較 同じ処理でどれだけ違うか、並べて見てみよう
「百聞は一見にしかず」ということで、同じ処理をWithなし・ありで並べて比較します。Withがどれほどコードをシンプルにするか、実際のコードで体感してください。
2-1. セル書式設定:Withなし vs あり
Excelのセル範囲に、背景色・フォント・枠線・配置をまとめて設定する例です。
Withなし(27行)
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行)
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なし
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あり
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を使うことで、コードの論理構造とオブジェクト階層が一致し、非常に読みやすくなります。
03 BASIC SYNTAX Withの基本構文 End With・ネスト可能な構造を正しく理解する
Withステートメントの基本構文はシンプルです。ただし、正しく使うためにいくつかのルールを押さえておく必要があります。
3-1. 基本構文の形
With オブジェクト
.プロパティ1 = 値1
.プロパティ2 = 値2
.メソッド名 引数
' ...
End With
ポイントは3つです。
📚 用語解説
オブジェクト:VBAで操作できる「モノ」の総称。ExcelのRange(セル範囲)・Worksheet(シート)・Workbook(ブック)・Font(フォント)・グラフなどがオブジェクトです。各オブジェクトはプロパティ(属性)とメソッド(動作)を持ちます。
3-2. 変数にオブジェクトを格納してWithを使う
Withにはオブジェクト変数も使えます。長いオブジェクト参照を変数に格納してからWithブロックに渡すパターンは、コードの再利用性を高めます。
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
長いオブジェクトパス(例:ThisWorkbook.Sheets("売上").Range("A1"))を毎回書くのは誤りの元です。Setで変数に格納してからWithブロックで使うパターンが、最もメンテナンスしやすいVBAの書き方です。
3-3. ネスト(入れ子)の基本ルール
Withは入れ子(ネスト)にできます。外側のWithブロックの内側に、さらに別のWithブロックを書くことで、階層的なオブジェクト構造を整理して表現できます。
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をネストするときは、End WithがどのWithと対応しているかを意識してください。インデント(字下げ)を適切に使うと、対応関係が視覚的に分かりやすくなります。End Withが1つ多い・少ないとコンパイルエラーになります。
04 EXCEL PRACTICE Excelでの実践例 セル書式・フォント・グラフをWithでまとめて設定する
ここからは実践的なコードを紹介します。Excelで最もよく使われるWithの活用パターンを、コピー&ペーストで使えるサンプルとして解説します。
4-1. セルの書式を一括設定する
Excelのセル書式設定は、Withと最も相性がよいユースケースのひとつです。フォント・背景色・配置・枠線をひとつのWithブロックにまとめましょう。
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が便利です。
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
4-3. グラフの見た目をWithで整える
グラフはオブジェクト階層が深いため、Withのネストによるコードが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 PRACTICE Wordでの実践例 段落設定・フォント・スタイルをWithでまとめて指定する
WithステートメントはExcelだけでなく、Word VBAでも広く使われます。段落のインデント・スペーシング・フォントなど、Wordの書式設定はプロパティが多いため、Withの効果が特に大きい場面です。
5-1. 段落書式の一括設定
Wordの段落に対してインデント・行間・スペースをWithでまとめて設定する例です。
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で設定する例です。複数の設定箇所をまとめることで、ドキュメントの一貫したデザインを効率よく維持できます。
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のDocumentオブジェクトはPageSetup・Styles・Sections・Paragraphsなど多くの子オブジェクトを持ちます。これらをネストのWithでまとめると、複雑なドキュメント設定でもコードが整理され、後から変更・再利用がしやすくなります。
06 NESTED WITH ネスト(入れ子)の使い方と注意点 正しい書き方・間違えやすいポイントを完全攻略
Withのネストは「オブジェクトの階層に沿ってコードを入れ子にする」技法です。正しく使えば可読性が大幅に上がりますが、いくつかの落とし穴もあります。
6-1. ネストの基本パターン
ネストはWith〜End Withの中に、さらにWith〜End Withを書く形です。
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が優先されてしまいます。
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がどこかを把握しにくくなります。
07 WITHEVENTS WithEventsキーワード イベント駆動プログラミングへの応用
WithEventsは、Withステートメントとは別の用途を持つキーワードですが、名前に「With」が付くため混同されることが多いです。ここでは両者の違いと、WithEventsの使い方を解説します。
📚 用語解説
WithEvents:VBAでクラスモジュールまたはフォームモジュールのモジュールレベルで変数を宣言するときに使うキーワード。WithEventsで宣言したオブジェクト変数は、そのオブジェクトが発生させるイベントをコードで捕捉(ハンドリング)できるようになります。Withステートメント(書式省略)とは全く別の機能です。
7-1. WithEventsとWithステートメントの違い
| 項目 | Withステートメント | WithEventsキーワード |
|---|---|---|
| 用途 | 同一オブジェクトへの参照を省略して記述 | オブジェクトのイベントを捕捉できる変数を宣言 |
| 書く場所 | プロシージャ内のコード | モジュールの宣言セクション(Dim行) |
| End Withが必要か | 必要 | 不要(Dim文のみ) |
| 主な使用場面 | セル書式・グラフ・ページ設定などの一括指定 | Excelブック・シート・フォームのイベント処理 |
7-2. WithEventsの基本的な使い方
WithEventsの典型的な使い方は、クラスモジュール内で別のブックやシートのイベントを監視するパターンです。
' クラスモジュール(例: 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が使えるのはクラスモジュール・ユーザーフォームモジュール・シートモジュール・Thisworkbookモジュールです。標準モジュールでは使えません。
7-3. WithEventsの実用例:シートの変更を監視する
シートモジュールに書く場合は、クラスの初期化が不要でよりシンプルに書けます。
'シートモジュール(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 ERROR HANDLING よくあるエラーと対処法 With使用中のオブジェクト参照エラーを解決する
Withステートメントを使うときに発生しやすいエラーとその対処法を解説します。エラーが出たときのデバッグ手順もあわせて紹介します。
8-1. 実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません
最もよく見かけるエラーが「実行時エラー 91」です。このエラーはWithの対象オブジェクトがNothing(空)のときに発生します。
Sub Error91Example():
Dim ws As Worksheet
' Set文を忘れてWithを使う → エラー91
With ws ' ws は Nothing のまま → エラー!
.Name = "テスト"
End With
End Sub
解決策は、Withブロックの前に必ずSetでオブジェクトを格納することです。
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ブロック内でドット(.)から始まらない行を書いた場合、意図せず外側のスコープの変数を参照しようとしてエラーになることがあります。
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ブロックの実行中に、対象オブジェクトが変更・削除されると予期しない動作になることがあります。
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エラーが出たときの確認チェックリスト
If obj Is Nothing Then ...)09 WITH + LOOP With + Loop の組み合わせ 大量セル処理の高速化・For Each・Do Whileとの連携
WithステートメントとループをうまくQへ組み合わせると、大量のセルや行を効率よく処理できます。ここでは実際の業務で使える実践的なパターンを紹介します。
9-1. For Each + With:コレクションの各要素に同じ設定を適用
コレクション(Sheetsコレクション・Rangeコレクションなど)の各要素に、同じ設定を繰り返し適用するパターンです。
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ループと組み合わせて、条件に応じたセル書式を大量行に適用する例です。
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
ループ内でセルを大量に操作する場合、Application.ScreenUpdating = False を事前に実行すると画面の再描画を抑制して処理が格段に速くなります。処理後は必ず True に戻してください。With + Loop にこの設定を組み合わせると、数千行の処理も現実的な時間で完了します。
9-3. Do While + With:条件が続く間、動的なオブジェクトを処理
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
10 GENAI CASE STUDY GENAI実運用のExcel自動化事例 With + Loop で業務マクロの作業工数を大幅削減した実例
ここでは、弊社株式会社GENAIが実際にVBAのWithステートメントを活用して業務を自動化した事例を紹介します。
10-1. 月次売上レポートの自動フォーマット(毎月3時間→8分に短縮)
弊社では毎月、複数のExcelシートからデータを集約して売上レポートを作成していました。以前はセル書式の設定・グラフの更新・ヘッダーの統一を手動で行っており、毎月1人が約3時間かけていました。
VBAのWithステートメントを活用したマクロを組んだ結果、同じ作業が8分程度で完了するようになりました。月間で約2.5時間の工数削減です。年間換算で30時間以上の削減になります。
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. 顧客リスト管理マクロ(条件付き書式を動的に適用)
営業チームが管理する顧客リストに、ステータス(商談中・成約・失注など)に応じた色分けを自動適用するマクロです。毎週月曜朝にマクロを実行することで、チーム全員がひと目でリストの状況を把握できるようになりました。
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
このマクロを導入した結果、「リストを見ただけで各案件の状況がわかる」という状態になり、週次ミーティングでの確認作業が半分以下の時間で完了するようになりました。
最初は「Withなしで動くコードを書く」→「後からWithで整理する」という手順が習得しやすい。動くコードが先にあることで、Withへのリファクタリング前後で動作を比較できる。
既存のVBAコードをWithで整理する(リファクタリング)際は、まず同一のオブジェクト参照(Range("A1")など)を検索して、何回登場するか数えてみましょう。5回以上繰り返されていればWithに書き換える価値があります。
11 CLAUDE CODE × VBA 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コードを生成させるときは、「何をしたいか(目的)」「対象のオブジェクト(セル範囲・シート・グラフなど)」「設定したいプロパティ」を具体的に伝えると精度が上がります。
ExcelのVBAで、セル範囲A1:G1をヘッダー行として書式設定するマクロを書いてください。
条件:フォントは游ゴシック・サイズ12・白・太字、背景色はRGB(17,94,89)、行高さ30、横・縦方向ともに中央揃え。
Withステートメントを活用してネストを使い、整理されたコードにしてください。
VBAで、ブック内の全シートに対してFor Each Worksheetループを使い、以下の処理を実行するマクロを書いてください。
①1行目を見出しとして色・フォントを設定 ②印刷設定でA4横向き・1ページに収める ③グリッド線と行列見出しを非表示にする。
Withのネストを適切に活用し、Application.ScreenUpdating = Falseで高速化してください。
ExcelのVBAで、指定されたシートが存在するか確認してからWithブロックでセル書式を設定するマクロを書いてください。
シートが見つからない場合はMsgBoxでエラーメッセージを表示してExit Sub。シートが見つかったらRange("A1:D10")のフォント・背景・枠線をWithで設定。
エラー91が発生しないよう、Is Nothing チェックを含めてください。
11-2. Claude Codeを使うメリット
Claude Codeは単にコードを生成するだけでなく、「なぜそのコードで動くか」の説明や「こうしたほうが良い」という改善提案もしてくれます。VBAの学習ツールとしても非常に有効です。
11-3. Claude Codeでの具体的な操作手順
Claude Codeを使うにはAnthropicのProプラン(月$20)以上の契約が必要です。追加料金なしでClaude Codeが使えるため、VBAコード生成に限らず、ビジネス全般の自動化・文書作成・データ分析まで幅広く活用できます。
📚 用語解説
Claude Code:AnthropicのAIモデル「Claude」を活用したターミナル型AIコーディングエージェント。コードの生成・デバッグ・リファクタリングをチャット形式で依頼できる。VBAに限らず、Python・JavaScript・SQL・シェルスクリプトなど多様な言語に対応している。
弊社GENAIでは、Claude Codeを「もう1人の開発者」として位置づけて運用しています。VBAマクロの依頼・Excelフォーマットの統一・業務フロー自動化コードの作成まで、AIが初稿を出してエンジニアがレビューするという流れが定着しています。
よくある質問
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ステートメントは、VBAを「動くコード」から「読みやすく・直しやすいコード」に進化させる第一歩です。まずは既存のマクロコードを見て、同じオブジェクト参照が繰り返されている箇所をWithに書き換えることから始めてみてください。
Claude Codeについてさらに詳しく知りたい方は、弊社が提供するAI鬼管理(株式会社GENAI)のサービスページをご覧ください。VBAをはじめとする業務自動化の導入支援を行っています。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




