Excel VBAでマクロを作成していると、
「あるはずのオブジェクトが存在せずエラーになる」
「人によってExcelの状態が違い、同じマクロが動いたり止まったりする」
といった問題に必ず直面します。
特に実務では、
- シートが存在しない
- ブックが開かれていない
- 名前付き範囲が削除されている
- オブジェクト変数が Nothing のまま使われている
など、
「オブジェクトが存在しないこと」が原因のエラー が非常に多く発生します。
この記事では、
Excel VBAにおいて オブジェクトの存在を確認する方法 をテーマに、
- なぜ存在確認が必須なのか
- よくある勘違いと失敗例
- オブジェクト別(ブック/シート/セル/名前/ファイルなど)の確認方法
- エラーハンドリングと組み合わせた安全な設計
- RPA(UiPath)連携を見据えた考え方
まで、実務でそのまま使えるコード例付きで徹底的に解説します。
目次
- ✅ なぜVBAでオブジェクトの存在確認が重要なのか
- ・VBAのエラー原因は「存在しないオブジェクト」が最多
- ・「自分の環境では動く」が一番危険
- ✅ VBAにおける「オブジェクト」とは何か
- ・VBAでいうオブジェクトの代表例
- ・Nothing と「存在しない」は同義ではない
- ✅ オブジェクト存在確認の基本パターン
- ・On Error Resume Next + 判定
- ✅ シート(Worksheet)の存在を確認する方法
- ・シート名で存在確認する
- ・存在しなければ作成するパターン
- ✅ ブック(Workbook)の存在を確認する方法
- ・すでに開かれているか確認する
- ・開かれていなければ開く
- ✅ セル・Rangeオブジェクトの存在確認
- ・Range指定でエラーになるケース
- ・事前に範囲をチェックする考え方
- ✅ 名前付き範囲(Name)の存在確認
- ・名前付き範囲を取得して確認
- ・削除されているケースに注意
- ✅ ファイルの存在を確認する方法
- ・Dir関数を使った確認
- ・存在確認 → 処理分岐
- ✅ オブジェクト変数が Nothing かを確認する
- ・Is Nothing を使う
- ・Set失敗後のチェックを習慣化する
- ✅ オブジェクト存在確認とエラーハンドリングの関係
- ・存在確認で防げるエラーは多い
- ✅ RPA(UiPath)連携を見据えた存在確認設計
- ✅ よくある失敗パターン
- ・存在確認をせずに直接操作
- ・Resume Next を使いっぱなし
- ・Nothingチェックをしない
- ✅ まとめ:VBAでオブジェクトの存在確認を習慣化しよう
✅ なぜ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の安定性と信頼性は劇的に向上します。
「動くマクロ」ではなく、
「環境が変わっても壊れないマクロ」
を目指すなら、
存在確認は避けて通れない必須スキルです。