VBAで自動化 VBAテクニック集 VBA一覧 Withステートメント 文法・構文

【VBA】With ステートメントで発生するエラーの原因と対策

Excel VBA で With ステートメントを使うと、コードの可読性が向上し、処理が効率化 されます。
しかし、With の使い方を誤ると オブジェクトが見つからない、プロパティの適用ミス、参照エラー などが発生することがあります。

本記事では、With ステートメントで発生しやすいエラーの原因と対策 を解説します。

With ステートメントの基本

VBA の With を使うと、同じオブジェクトのプロパティやメソッドを簡潔に記述できます。

正しい With の使い方

Sub CorrectWithUsage()

With Range("A1:A10")

.Font.Bold = True
.Font.Size = 12
.Interior.Color = RGB(255, 255, 0)

End With

End Sub

📌 With を使うことで Range("A1:A10") の繰り返し記述を省略!
📌 しかし、With の使い方を誤るとエラーが発生することがある!

With ステートメントで発生するエラーと対策

オブジェクトが存在しない

【エラー内容】

With の対象オブジェクトが Nothing の場合、VBA は "オブジェクトがありません" というエラーを出します。

【VBA】オブジェクトの存在を確認する方法

【発生するコード】

Sub Error_MissingObject()

Dim ws As Worksheet
With ws

.Range("A1").Value = "テスト"

End With

End Sub

📌 変数 ws に何もセットされていないため、エラー発生!

【解決策】Set でオブジェクトを確実に指定

Sub Fix_MissingObject()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' シートを明示的にセット

With ws

.Range("A1").Value = "テスト"

End With

End Sub

Set を使ってオブジェクトを明示的に指定すればエラー回避!

【VBA】Setのわかりやすい活用方法と活用場面

✅With の対象オブジェクトが見つからない

【エラー内容】

存在しないシートやブックを With の対象にすると、"インデックスが有効範囲にありません" というエラーが発生します。

【発生するコード】

Sub Error_SheetNotFound()

With ThisWorkbook.Sheets("不存在のシート")

.Range("A1").Value = "データ"

End With

End Sub

📌 存在しないシートを With で指定するとエラーになる!

【解決策】シートが存在するか事前にチェック

Sub Fix_SheetNotFound()

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 Error_MixedObjectReference()

With Range("A1:A10")

.Font.Bold = True
.Font.Size = 12
Cells(1, 1).Value = "テスト" ' ここが問題

End With

End Sub

📌 Cells(1,1).ValueWithRange("A1:A10") とは別のオブジェクト!
📌 エラーにはならないが、意図しない動作をする可能性がある!

【解決策】With の中では .プロパティ を使う

Sub Fix_MixedObjectReference()

With Range("A1:A10")

.Font.Bold = True
.Font.Size = 12
.Cells(1, 1).Value = "テスト" ' これならOK

End With

End Sub

With の中では、対象オブジェクトのプロパティを明示的に参照!

【VBA】複数オブジェクトで With を使う方法と書き方の工夫

✅With を適用できないオブジェクトを指定

【エラー内容】

Withオブジェクトに対してのみ適用可能 ですが、数値や文字列を指定するとエラーになります。

【発生するコード】

Sub Error_InvalidWithUsage()

Dim num As Integer
num = 100

With num

.ToString ' 数値には `With` を適用できないためエラー!

End With

End Sub

📌 With はオブジェクト専用!数値や文字列には使えない!

【解決策】変数をオブジェクトにする

Sub Fix_InvalidWithUsage()

Dim rng As Range
Set rng = Range("A1:A10")

With rng

.Font.Bold = True

End With

End Sub

With で使う変数はオブジェクト型にする!


まとめ

エラー種類原因解決策
オブジェクトが NothingSet されていないSet でオブジェクトを指定
シートやブックが見つからない存在しないオブジェクトを参照If ws Is Nothing で事前チェック
With の中で別のオブジェクトを参照With の対象外を . なしで参照With の中では .プロパティ を使う
オブジェクト以外を With に使用数値や文字列を指定With はオブジェクト型にのみ適用
With を正しく使うためのポイント
  1. Set を忘れずに記述

  2. オブジェクトが存在するか確認

  3. With の中では .プロパティ を使う

  4. ネストしすぎない(深い With は可読性が低下する)

-VBAで自動化, VBAテクニック集, VBA一覧, Withステートメント, 文法・構文