it

a

当サイトでは記事内に広告を含みます

記事を作成します。

【Excel VBA】シートの存在チェックをする方法(存在するか確認・非表示の判定・再表示・シート検索)

Excelで作業を自動化するとき、「このシートは存在するのか」「非表示になっていないか」といった確認が必要になる場面は意外と多いものです。シートが存在しないのにコードを実行してしまうと、エラーが発生してマクロが途中で止まってしまいます。そうしたトラブルを未然に防ぐために、VBAでシートの存在チェックをする方法を身につけておくことが重要でしょう。

本記事では、シートが存在するかどうかを確認する基本的なコードから、非表示シートの判定・再表示、さらにシート名を検索して動的に処理する応用テクニックまでを丁寧に解説していきます。シートの存在チェック、WorksheetsコレクションのループとOn Error構文の使い方、Visible プロパティによる非表示判定、xlSheetVeryHiddenの扱いなど、実務でそのまま使えるサンプルコードも豊富に紹介します。VBA初心者から中級者まで、ぜひ参考にしてみてください。

【Excel VBA】シートの存在チェックには「ループ確認」と「エラー回避」の2つのアプローチがある

それではまず、シートの存在チェックの概要と代表的なアプローチについて解説していきます。

VBAでシートの存在を確認する方法には、大きく分けて2つのアプローチがあります。ひとつはWorksheetsコレクションをループしてシート名を比較する方法、もうひとつはOn Error構文を使ってエラーを制御する方法です。どちらにも長所と短所があるため、用途に応じて使い分けることが大切でしょう。

以下に、2つのアプローチの特徴を比較した表を示します。

アプローチ 主な特徴 メリット デメリット
ループによる確認 全シートを順番に調べる 可読性が高く、条件を追加しやすい シート数が多いとやや処理が遅い
On Error構文 エラーを意図的に発生させて判断する コードが短くシンプル エラー処理の流れが複雑になりやすい

ループを使ったシート存在チェックの基本

まずはループを使う方法を見ていきましょう。Worksheetsコレクションに含まれるすべてのシートを1枚ずつ調べ、指定したシート名と一致するものがあればTrueを返す、というシンプルな仕組みです。


' シートの存在チェック関数(ループ方式)
Function SheetExists(sheetName As String) As Boolean
    Dim ws As Worksheet
    SheetExists = False
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = sheetName Then
            SheetExists = True
            Exit For
        End If
    Next ws
End Function

' 呼び出し側のコード
Sub CheckSheetLoop()
    If SheetExists("アボカドデータ") Then
        MsgBox "シート「アボカドデータ」は存在します。"
    Else
        MsgBox "シート「アボカドデータ」は存在しません。"
    End If
End Sub

このコードでは、For Each ループを使って Worksheets コレクション内のすべてのシートを走査しています。ws.Name が引数 sheetName と一致した時点で SheetExists = True として Exit For でループを抜ける仕組みです。シンプルで読みやすいコードになっています。

On Error構文を使ったシート存在チェック

次に、On Error 構文を活用した方法です。Worksheets に存在しないシート名を指定すると VBA はエラーを発生させます。それを逆手にとって、エラーが起きたかどうかでシートの有無を判断します。


' On Errorを使ったシート存在チェック関数
Function SheetExistsOnError(sheetName As String) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(sheetName)
    On Error GoTo 0
    SheetExistsOnError = Not (ws Is Nothing)
End Function

' 呼び出し側のコード
Sub CheckSheetOnError()
    If SheetExistsOnError("ドラゴンフルーツシート") Then
        MsgBox "シート「ドラゴンフルーツシート」は存在します。"
    Else
        MsgBox "シート「ドラゴンフルーツシート」は存在しません。"
    End If
End Sub

On Error Resume Next を記述した後、Worksheets に対してシート名を指定してオブジェクトのセットを試みます。シートが存在しない場合は ws が Nothing のままとなるため、Not (ws Is Nothing) で真偽を判定しています。On Error GoTo 0 は忘れずに記述し、エラー制御を元に戻すことが重要です。

どちらのアプローチを選ぶべきか

ループ方式は処理の流れが明確で、初心者にもわかりやすい構造です。一方、On Error 方式はコードが短く、素早く書ける点が魅力でしょう。ただし、On Error Resume Next はエラーを一時的に無視してしまうため、意図しないバグを隠してしまうリスクもあります。

実務では「ループ方式」を関数化して使い回すのがおすすめです。コードの意図が明確で、後からメンテナンスがしやすくなります。On Error 方式は簡易チェックとして使う程度に留めるとよいでしょう。

シートの存在チェックを関数化してプログラムで活用する方法

続いては、シート存在チェックを関数として汎用化し、実際のプログラムの中で活用するパターンを確認していきます。

単体でシートの有無を確認するだけでなく、存在確認の結果に応じて「シートを作成する」「処理をスキップする」「メッセージを表示する」といった分岐処理を組み込むことで、より実用的なコードになります。

シートが存在しない場合に自動作成するパターン

よく使われるパターンのひとつが、シートが存在しない場合に自動で新規作成するコードです。毎月のデータ更新などで、シートが未作成の場合でも安全に処理を進めることができます。


' シートが存在しなければ作成するサブ
Sub CreateSheetIfNotExists(sheetName As String)
    If Not SheetExists(sheetName) Then
        ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = sheetName
        MsgBox "シート「" & sheetName & "」を新規作成しました。"
    Else
        MsgBox "シート「" & sheetName & "」はすでに存在します。"
    End If
End Sub

' 呼び出し側のコード
Sub RunCreateSheet()
    Call CreateSheetIfNotExists("サーモンレポート")
End Sub

Worksheets.Add の引数 After を使うことで、既存のシートの末尾に新しいシートを追加しています。Add した直後に .Name プロパティで名前を設定するのが一般的な書き方です。

シートが存在する場合にのみ処理を実行するパターン

「シートがある場合だけデータを読み込む」という処理も実務では頻繁に登場します。存在チェックの結果を条件分岐に組み込むことで、エラーのない堅牢なコードになります。


' シートが存在する場合のみデータ処理を実行するサブ
Sub ProcessIfSheetExists()
    Dim targetSheet As String
    targetSheet = "ゴリラデータ"

```
If SheetExists(targetSheet) Then
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(targetSheet)
    ws.Range("A1").Value = "処理済み"
    MsgBox targetSheet & " の処理が完了しました。"
Else
    MsgBox targetSheet & " が見つからないため、処理をスキップしました。"
End If
```

End Sub

このコードでは、SheetExists 関数の戻り値を If 文で判定し、True の場合のみシートを Worksheet オブジェクトにセットして処理を実行しています。Else 節でスキップのメッセージを表示することで、利用者への案内も忘れずに行う設計です。

複数シートをまとめて存在確認するパターン

複数のシート名をまとめて確認し、存在しないシートがある場合にまとめて警告を出したいケースもあるでしょう。配列とループを組み合わせることで、効率よく処理できます。


' 複数シートの存在をまとめて確認するサブ
Sub CheckMultipleSheets()
    Dim sheetNames() As String
    Dim missingSheets As String
    Dim i As Integer

```
sheetNames = Split("ドラゴンフルーツ,アボカド,サーモン,ロバ,ネジ", ",")
missingSheets = ""

For i = 0 To UBound(sheetNames)
    If Not SheetExists(sheetNames(i)) Then
        missingSheets = missingSheets & "・" & sheetNames(i) & Chr(10)
    End If
Next i

If missingSheets = "" Then
    MsgBox "すべてのシートが存在します。"
Else
    MsgBox "以下のシートが見つかりませんでした:" & Chr(10) & missingSheets
End If
```

End Sub

Split 関数でカンマ区切りの文字列を配列に変換し、UBound でループ上限を取得しています。存在しないシート名を missingSheets に連結していき、最後に一括でメッセージ表示する仕組みです。

非表示シートの判定方法とVisible プロパティの使い方

続いては、非表示シートの判定方法について詳しく確認していきます。

VBAでシートを扱う際に注意が必要なのが、非表示(Hidden)のシートの扱いです。Worksheets コレクションには非表示のシートも含まれるため、ループによる存在チェックは非表示シートも「存在する」と判定します。シートが非表示かどうかを個別に確認したい場合は、Visible プロパティを使います。

Visible プロパティの3つの状態

シートの Visible プロパティには、以下の3種類の状態があります。

定数 意味 手動での再表示
xlSheetVisible -1(True) 表示状態 可能
xlSheetHidden 0(False) 通常の非表示 可能
xlSheetVeryHidden 2 完全に隠された状態 VBAからのみ可能

xlSheetVeryHidden は、Excelの画面上からは再表示できない特殊な非表示状態です。VBAを使った場合のみ Visible プロパティを変更して再表示できます。設定シートや管理シートを隠しておく際によく活用される状態でしょう。

シートが非表示かどうかを判定するコード

Visible プロパティを確認することで、シートが表示中か、非表示か、あるいは完全に隠されているかを判定できます。


' シートの表示状態を確認する関数
Function GetSheetVisibility(sheetName As String) As String
    If Not SheetExists(sheetName) Then
        GetSheetVisibility = "存在しない"
        Exit Function
    End If

```
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)

Select Case ws.Visible
    Case xlSheetVisible
        GetSheetVisibility = "表示中"
    Case xlSheetHidden
        GetSheetVisibility = "非表示(通常)"
    Case xlSheetVeryHidden
        GetSheetVisibility = "非表示(完全非表示)"
    Case Else
        GetSheetVisibility = "不明"
End Select
```

End Function

' 呼び出し側のコード
Sub CheckVisibility()
    Dim result As String
    result = GetSheetVisibility("ボルト管理")
    MsgBox "「ボルト管理」シートの状態:" & result
End Sub

Select Case 文を使うことで、Visible プロパティの各状態を明確に分岐させています。存在しないシート名を指定された場合のチェックも先頭で行い、関数の安全性を高めている点がポイントです。

非表示シートのみをリストアップするコード

ブック内の非表示シートをすべて洗い出したい場合もあるでしょう。以下のコードで、非表示・完全非表示のシートをまとめて確認できます。


' 非表示シートをすべてリストアップするサブ
Sub ListHiddenSheets()
    Dim ws As Worksheet
    Dim hiddenList As String
    hiddenList = ""

```
For Each ws In ThisWorkbook.Worksheets
    If ws.Visible = xlSheetHidden Then
        hiddenList = hiddenList & "【非表示】" & ws.Name & Chr(10)
    ElseIf ws.Visible = xlSheetVeryHidden Then
        hiddenList = hiddenList & "【完全非表示】" & ws.Name & Chr(10)
    End If
Next ws

If hiddenList = "" Then
    MsgBox "非表示のシートはありません。"
Else
    MsgBox "非表示のシート一覧:" & Chr(10) & hiddenList
End If
```

End Sub

For Each でループしながら Visible プロパティを確認し、非表示状態のシートだけをリストに追加していきます。ブックの構成を把握したいときに重宝するコードです。

非表示シートを再表示する方法とxlSheetVeryHiddenの解除

続いては、非表示になっているシートをVBAから再表示させる方法を確認していきます。

Visible プロパティに xlSheetVisible を設定することで、シートを再表示できます。通常の非表示(xlSheetHidden)も完全非表示(xlSheetVeryHidden)も、同じ方法で解除可能です。

特定の非表示シートを再表示するコード

シート名を指定して、そのシートを再表示する関数を作成しましょう。存在確認と表示状態の確認を組み合わせた、実用的な構成です。


' 指定シートを再表示する関数
Function ShowSheet(sheetName As String) As Boolean
    If Not SheetExists(sheetName) Then
        MsgBox "シート「" & sheetName & "」が存在しません。"
        ShowSheet = False
        Exit Function
    End If

```
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)

If ws.Visible = xlSheetVisible Then
    MsgBox "シート「" & sheetName & "」はすでに表示されています。"
    ShowSheet = False
Else
    ws.Visible = xlSheetVisible
    MsgBox "シート「" & sheetName & "」を再表示しました。"
    ShowSheet = True
End If
```

End Function

' 呼び出し側のコード
Sub RunShowSheet()
    Call ShowSheet("パソコン設定")
End Sub

Visible プロパティに xlSheetVisible を代入するだけで、xlSheetHidden でも xlSheetVeryHidden でも再表示が可能です。すでに表示中であれば無駄な処理をしないよう、事前に確認する分岐も設けています。

すべての非表示シートを一括再表示するコード

ブック内のすべての非表示シートをまとめて再表示したい場合は、ループとVisible プロパティの変更を組み合わせます。


' すべての非表示シートを一括再表示するサブ
Sub ShowAllHiddenSheets()
    Dim ws As Worksheet
    Dim count As Integer
    count = 0

```
For Each ws In ThisWorkbook.Worksheets
    If ws.Visible <> xlSheetVisible Then
        ws.Visible = xlSheetVisible
        count = count + 1
    End If
Next ws

If count = 0 Then
    MsgBox "再表示したシートはありませんでした。"
Else
    MsgBox count & " 枚のシートを再表示しました。"
End If
```

End Sub

<> xlSheetVisible という条件で、非表示・完全非表示の両方を対象にしています。再表示したシートの枚数をカウントして最後に表示することで、処理結果がひと目でわかる仕様です。

シートを非表示にするコード(参考)

逆に、シートを非表示にする処理も確認しておきましょう。Visible プロパティを変更するだけで設定できます。


' シートを非表示にするサブ(通常非表示と完全非表示)
Sub HideSheetSample()
    ' 通常の非表示(Excelの「シートの再表示」から元に戻せる)
    ThisWorkbook.Worksheets("キーボード在庫").Visible = xlSheetHidden

```
' 完全非表示(VBAからのみ再表示可能)
ThisWorkbook.Worksheets("おもちゃ設定").Visible = xlSheetVeryHidden

MsgBox "シートを非表示にしました。"
```

End Sub

xlSheetVeryHidden を使うと、Excelの画面上の「シートの再表示」メニューに表示されなくなります。ユーザーに見せたくない設定シートや管理シートを守るための有効な手段ですが、VBAを使える人には解除できてしまうため、セキュリティ目的での完全な保護には向いていません。用途をしっかり理解した上で活用しましょう。

シート名を検索して動的に処理する応用テクニック

続いては、シート名を部分一致や条件で検索して、動的に処理を行う応用的なテクニックを確認していきます。

これまでのコードは完全一致でシート名を指定していました。しかし実務では、「〇月」が含まれるシートをすべて処理したい、接頭辞が一致するシートのリストを取得したい、といったニーズも発生します。VBAのInStr関数やLike演算子を活用することで、柔軟なシート検索が実現できます。

部分一致でシートを検索するコード

InStr関数を使えば、シート名に特定の文字列が含まれているかどうかを判定できます。「ロバ」から始まるシート、「集計」で終わるシートなど、パターンを指定して絞り込めます。


' 部分一致でシートを検索してリスト返却する関数
Function FindSheetsByKeyword(keyword As String) As String
    Dim ws As Worksheet
    Dim resultList As String
    resultList = ""

```
For Each ws In ThisWorkbook.Worksheets
    If InStr(ws.Name, keyword) > 0 Then
        resultList = resultList & ws.Name & Chr(10)
    End If
Next ws

FindSheetsByKeyword = resultList
```

End Function

' 呼び出し側のコード
Sub SearchSheetByKeyword()
    Dim result As String
    result = FindSheetsByKeyword("サーモン")

```
If result = "" Then
    MsgBox "「サーモン」を含むシートは見つかりませんでした。"
Else
    MsgBox "「サーモン」を含むシート一覧:" & Chr(10) & result
End If
```

End Sub

InStr 関数は、第1引数の文字列に第2引数が含まれている場合に0より大きい値を返します。含まれていない場合は0が返るため、0より大きいかどうかで一致を判定できます。

Like演算子を使ったパターンマッチングでシートを検索する

Like演算子を使うと、ワイルドカードを使ったより柔軟なパターンマッチングが可能です。「*データ」「アボカド*」のような前後一致での検索に活用できます。


' Like演算子でパターンマッチングするシート検索関数
Function FindSheetsByPattern(pattern As String) As String
    Dim ws As Worksheet
    Dim resultList As String
    resultList = ""

```
For Each ws In ThisWorkbook.Worksheets
    If ws.Name Like pattern Then
        resultList = resultList & ws.Name & Chr(10)
    End If
Next ws

FindSheetsByPattern = resultList
```

End Function

' 呼び出し側のコード
Sub SearchByPattern()
    Dim result As String

```
' "アボカド"で始まるシートを検索
result = FindSheetsByPattern("アボカド*")

If result = "" Then
    MsgBox "パターンに一致するシートは見つかりませんでした。"
Else
    MsgBox "一致したシート一覧:" & Chr(10) & result
End If
```

End Sub

Like演算子で使えるワイルドカードは、「*」が任意の文字列、「?」が任意の1文字です。日本語のシート名でも問題なく動作するため、実務での活用シーンは多いでしょう。

検索結果のシートに一括で処理を実行するコード

特定のパターンに一致したシート全体に、一括でデータ処理や書式設定を行いたい場合のコード例です。


' 条件に一致するシートに一括処理を行うサブ
Sub BatchProcessByKeyword()
    Dim ws As Worksheet
    Dim keyword As String
    Dim processCount As Integer

```
keyword = "ネジ"
processCount = 0

For Each ws In ThisWorkbook.Worksheets
    If InStr(ws.Name, keyword) > 0 And ws.Visible = xlSheetVisible Then
        ' 一致した表示シートの処理(例:A1セルに「処理済み」を記入)
        ws.Range("A1").Value = "処理済み"
        ws.Range("A1").Interior.Color = RGB(198, 239, 206)
        processCount = processCount + 1
    End If
Next ws

MsgBox keyword & " を含む表示シート " & processCount & " 枚を処理しました。"
```

End Sub

InStr による名前の一致チェックと、Visible による表示状態のチェックを And 条件で組み合わせています。非表示シートは除外して処理するという、実務でよく求められる仕様になっています。

まとめ

本記事では、Excel VBA を使ったシートの存在チェック方法について、基礎から応用まで幅広く解説しました。

ループ方式と On Error 方式の2つのアプローチはそれぞれ特徴があり、用途に応じて使い分けることが大切です。可読性を重視するならループ方式の関数化が適しているでしょう。

非表示シートについては、xlSheetHidden と xlSheetVeryHidden の違いを理解した上で、Visible プロパティを使った判定・再表示・一括処理を組み合わせることで、より堅牢なマクロを作成できます。

さらに、InStr 関数や Like 演算子を活用したシート名の部分一致・パターン検索により、動的なシート処理が可能になります。シート構成が複雑なブックでも、効率よくメンテナンス性の高いコードを書けるようになるでしょう。

今回紹介したコードはそのまま活用できるものばかりです。ぜひ自分のプロジェクトに組み込んで、VBA の活用の幅を広げてみてください。