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 は "オブジェクトがありません" というエラーを出します。
【発生するコード】
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
を使ってオブジェクトを明示的に指定すればエラー回避!
✅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).Value
は With
の Range("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
で使う変数はオブジェクト型にする!
まとめ
エラー種類 | 原因 | 解決策 |
---|---|---|
オブジェクトが Nothing | Set されていない | Set でオブジェクトを指定 |
シートやブックが見つからない | 存在しないオブジェクトを参照 | If ws Is Nothing で事前チェック |
With の中で別のオブジェクトを参照 | With の対象外を . なしで参照 | With の中では .プロパティ を使う |
オブジェクト以外を With に使用 | 数値や文字列を指定 | With はオブジェクト型にのみ適用 |
With を正しく使うためのポイント
Set
を忘れずに記述オブジェクトが存在するか確認
With
の中では.プロパティ
を使うネストしすぎない(深い
With
は可読性が低下する)