ExcelVBAでよくあるエラーの1つが、存在しないシート名を指定してしまうパターンです。
たとえば、次のようなコードを書いたときに…
Worksheets("集計").Range("A1").Value = "OK"
もし「集計」というシートがなければ、マクロは途中で止まり、エラーになります。
そこで役に立つのが、今回紹介する「シートが存在するかチェックする基本コード」です。
これを入れておくだけで、シート名のミスや削除によるトラブルをかなり減らせます。
この記事でできること
- 指定したシートが存在するかを事前にチェックできる
- 存在しない場合は、エラーを出さずに処理を止められる
- 存在しない場合に、シートを自動で作ることもできる
基本:シートの存在チェック関数(コピペOK)
まずは一番よく使う「存在チェック用の関数」です。
標準モジュールに貼り付けて使います。
Option Explicit
' 指定したシートが存在するかチェックする関数
Public Function SheetExists(ByVal sheetName As String, Optional ByVal wb As Workbook) As Boolean
Dim ws As Worksheet
If wb Is Nothing Then
Set wb = ThisWorkbook
End If
On Error Resume Next
Set ws = wb.Worksheets(sheetName)
On Error GoTo 0
SheetExists = Not (ws Is Nothing)
End Function
使い方:存在する場合だけ処理する
たとえば「集計」シートがあるときだけ書き込みたい場合は、こうします。
Sub WriteIfSheetExists()
If SheetExists("集計") Then
Worksheets("集計").Range("A1").Value = "シートがあったので書き込みました"
Else
MsgBox "『集計』シートが見つかりません。", vbExclamation
End If
End Sub
これで、シートが存在しない場合でもエラーにならず、メッセージを出して終われます。
応用:無ければ自動で作ってから処理する
「シートが無ければ作る」という実務パターンも多いです。
以下は、無ければ新規作成してから処理を続ける例です。
Sub CreateSheetIfNotExists()
Dim ws As Worksheet
If Not SheetExists("集計") Then
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
ws.Name = "集計"
Else
Set ws = Worksheets("集計")
End If
ws.Range("A1").Value = "準備OK"
End Sub
初心者がつまずきやすいポイント
① シート名の全角・半角やスペース
「集計 」のように、末尾にスペースが入っているだけでも別名扱いになります。
シート名が一致しているかは注意が必要です。
② ThisWorkbook と ActiveWorkbook の違い
今回の関数は、特に指定がなければ ThisWorkbook(マクロが入っているブック)を対象にしています。
別ブックを対象にしたい場合は、引数にWorkbookを渡せます。
Sub CheckOtherWorkbook()
Dim wb As Workbook
Set wb = ActiveWorkbook
If SheetExists("集計", wb) Then
MsgBox "アクティブブックに『集計』シートがあります。"
End If
End Sub
まとめ:シート存在チェックは“安全なVBA”の第一歩
VBAは、ちょっとした条件違い(シート名の変更・削除など)でエラー停止しやすいです。
今回のような基本チェックコードを最初に入れておくと、実務でも安心して使えるマクロになります。
- シートがある前提のコードは危険
- 存在チェックを入れると、エラー停止を防げる
- 無ければ作る処理も簡単に書ける
ぜひ、あなたのVBAテンプレ(定番部品)として使ってみてください。


コメント