VBAテクニック集 VBA一覧 エラーハンドリング・処理制御 デバッグ・エラー処理

【VBA】オブジェクトの存在を確認する方法|エラーを防ぐ実務必須テクニック

Excel VBAでマクロを作成していると、
あるはずのオブジェクトが存在せずエラーになる
「人によってExcelの状態が違い、同じマクロが動いたり止まったりする
といった問題に必ず直面します。

特に実務では、

  • シートが存在しない
  • ブックが開かれていない
  • 名前付き範囲が削除されている
  • オブジェクト変数が Nothing のまま使われている

など、
「オブジェクトが存在しないこと」が原因のエラー が非常に多く発生します。

この記事では、
Excel VBAにおいて オブジェクトの存在を確認する方法 をテーマに、

  • なぜ存在確認が必須なのか
  • よくある勘違いと失敗例
  • オブジェクト別(ブック/シート/セル/名前/ファイルなど)の確認方法
  • エラーハンドリングと組み合わせた安全な設計
  • RPA(UiPath)連携を見据えた考え方

まで、実務でそのまま使えるコード例付きで徹底的に解説します。

目次

✅ なぜVBAでオブジェクトの存在確認が重要なのか

※ここを軽視すると、「環境依存で壊れるマクロ」になります。

・VBAのエラー原因は「存在しないオブジェクト」が最多

VBAの実行時エラーの多くは、
オブジェクトが存在しない状態で操作しようとすること が原因です。

代表的な例として、

  • Worksheets("Data") が存在しない
  • Workbooks("sample.xlsx") が開かれていない
  • Set されていないオブジェクト変数を使っている

といったケースがあります。

これらはすべて、
事前に存在確認をしていれば防げるエラー です。


・「自分の環境では動く」が一番危険

実務でよくあるのが、

自分のPCでは問題なく動くのに、他の人のPCで止まる

というケースです。

これは、

  • シート名が違う
  • 不要なシートを削除している
  • ファイル構成が異なる

など、
オブジェクトの存在前提が崩れている ことが原因です。


✅ VBAにおける「オブジェクト」とは何か

※ここが曖昧だと、存在確認の考え方も曖昧になります。

・VBAでいうオブジェクトの代表例

Excel VBAで扱う主なオブジェクトには、以下があります。

  • Workbook
  • Worksheet
  • Range
  • Name(名前付き範囲)
  • Chart
  • File / Folder(ファイル操作時)

これらはすべて、
存在しなければ操作できない対象 です。


・Nothing と「存在しない」は同義ではない

VBAでは、
オブジェクト変数が Nothing の場合、

  • 参照先が設定されていない
  • Set に失敗している

という状態を意味します。

Dim ws As Worksheet
Debug.Print ws Is Nothing  ' True

これは、
オブジェクトが存在しない、または取得できていない状態 を示します。


✅ オブジェクト存在確認の基本パターン

※すべての確認方法の土台になります。

・On Error Resume Next + 判定

VBAでは、
存在しないオブジェクトを直接取得しようとするとエラーになります。

そのため、
一時的にエラーを無視して取得 → 結果を判定
という構造を取るのが基本です。

Dim ws As Worksheet

On Error Resume Next
Set ws = Worksheets("Data")
On Error GoTo 0

If ws Is Nothing Then
    MsgBox "シートが存在しません"
End If

この形は、
シート・ブック・名前付き範囲など、
ほぼすべての存在確認に応用可能です。

参考:【VBA】Nothingとは?オブジェクト変数の初期化と解放をわかりやすく解説




✅ シート(Worksheet)の存在を確認する方法

※最も使用頻度が高く、最もエラーが出やすいポイントです。

・シート名で存在確認する

Dim ws As Worksheet

On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Data")
On Error GoTo 0

If ws Is Nothing Then
    ' 存在しない
Else
    ' 存在する
End If

・存在しなければ作成するパターン

If ws Is Nothing Then
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = "Data"
End If

「確認 → なければ作る」
この流れは実務で非常によく使われます。


✅ ブック(Workbook)の存在を確認する方法

※RPA連携・複数ブック処理で必須です。

・すでに開かれているか確認する

Dim wb As Workbook

On Error Resume Next
Set wb = Workbooks("sample.xlsx")
On Error GoTo 0

If wb Is Nothing Then
    MsgBox "ブックは開かれていません"
End If

・開かれていなければ開く

If wb Is Nothing Then
    Set wb = Workbooks.Open("C:\Data\sample.xlsx")
End If

✅ セル・Rangeオブジェクトの存在確認

※Rangeは「存在しない」というより「取得できない」がポイントです。

・Range指定でエラーになるケース

Cells(0, 1).Value = 100   ' 実行時エラー

・事前に範囲をチェックする考え方

  • 行番号・列番号が有効か
  • 対象シートが存在するか

Range単体より、前段のオブジェクト確認が重要です。


✅ 名前付き範囲(Name)の存在確認

※中級者以上でもつまずきやすいポイントです。

・名前付き範囲を取得して確認

Dim nm As Name

On Error Resume Next
Set nm = ThisWorkbook.Names("MyRange")
On Error GoTo 0

If nm Is Nothing Then
    MsgBox "名前付き範囲が存在しません"
End If

・削除されているケースに注意

名前付き範囲は、
ユーザー操作で簡単に削除されるため、
必ず存在確認を入れるべき対象です。


✅ ファイルの存在を確認する方法

※VBA単体だけでなく、業務自動化で必須です。

・Dir関数を使った確認

If Dir("C:\Data\sample.xlsx") = "" Then
    MsgBox "ファイルが存在しません"
End If

・存在確認 → 処理分岐

If Dir(path) <> "" Then
    Workbooks.Open path
Else
    ' エラー処理
End If

✅ オブジェクト変数が Nothing かを確認する

※Set漏れによるエラー防止に必須です。

・Is Nothing を使う

If ws Is Nothing Then
    MsgBox "オブジェクトが設定されていません"
End If

・Set失敗後のチェックを習慣化する

Set ws = Nothing
Set ws = Worksheets("Data")

If ws Is Nothing Then
    Exit Sub
End If

✅ オブジェクト存在確認とエラーハンドリングの関係

※存在確認はエラー処理の一部です。

・存在確認で防げるエラーは多い

  • Subscript out of range
  • Object variable not set
  • Application-defined or object-defined error

これらは、
存在確認不足が原因であることがほとんどです。

参考:【VBA】エラーハンドリングの基本と実務で使えるオープンエラーハンドリング徹底解説


✅ RPA(UiPath)連携を見据えた存在確認設計

※Excel単体で終わらない現場では重要です。

RPAからExcelマクロを呼び出す場合、

  • VBAが止まる → RPAも停止
  • VBAが静かに処理 → RPAは継続

という構図になります。

そのため、

  • オブジェクト存在確認を徹底
  • 想定外エラーを極力出さない
  • ログに原因を残す

という設計が求められます。


✅ よくある失敗パターン

※ここに当てはまったら要注意です。

・存在確認をせずに直接操作

→ 実行時エラー多発

・Resume Next を使いっぱなし

→ エラーに気づけない

・Nothingチェックをしない

→ 原因不明エラーになる

参考:【VBA】Nothingとは?オブジェクト変数の初期化と解放をわかりやすく解説


✅ まとめ:VBAでオブジェクトの存在確認を習慣化しよう

  • オブジェクトは「ある前提」で扱わない
  • Resume Next は存在確認のために限定使用する
  • Is Nothing を必ず使う
  • シート・ブック・名前・ファイルは特に重要
  • 存在確認は「エラー対策」ではなく「設計思想」

オブジェクトの存在確認を徹底するだけで、
VBAの安定性と信頼性は劇的に向上します。

「動くマクロ」ではなく、
「環境が変わっても壊れないマクロ」
を目指すなら、
存在確認は避けて通れない必須スキルです。

    -VBAテクニック集, VBA一覧, エラーハンドリング・処理制御, デバッグ・エラー処理