Excel VBA で作業を自動化する際、指定したシートが存在しない場合に自動で新しいシートを作成したい場面がよくあります。
この記事では、シートが存在するかを確認し、存在しない場合は自動で作成する方法を基本から活用例まで解説します。
目次
シートが存在するか確認する方法
シートが既に存在するかを確認する必要があります。そのために、Worksheets コレクションを使用してシート名をチェックします。
【シートの存在確認】
Function SheetExists(sheetName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets(sheetName)
SheetExists = Not ws Is Nothing
On Error GoTo 0
End Function
解説
Worksheets(sheetName)を使用してシート名を検索します。- シートが存在しない場合は
wsがNothingになるため、それを利用して真偽値を返します。
シートがなければ作成する基本例
シートが存在しない場合に新しいシートを作成するコードを紹介します。【VBA】シートを追加して名前を付ける方法:Sheets.Addメソッド・Nameプロパティ
【シートがなければ作成】
Sub CreateSheetIfNotExists()
Dim sheetName As String
sheetName = "新しいシート"
If Not SheetExists(sheetName) Then
Worksheets.Add.Name = sheetName
MsgBox "シート '" & sheetName & "' を作成しました。"
Else
MsgBox "シート '" & sheetName & "' は既に存在します。"
End If
End Sub
解説
SheetExists関数を使用してシートの存在を確認します。- シートが存在しない場合、
Worksheets.Addを使って新しいシートを作成し、名前を設定します。
指定の位置にシートを作成
デフォルトでは、新しいシートは現在のアクティブなシートの前に追加されます。特定の位置にシートを作成したい場合は、Before または After プロパティを使用します。
【指定の位置に作成】
Sub CreateSheetAtPosition()
Dim sheetName As String
sheetName = "レポート"
If Not SheetExists(sheetName) Then
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = sheetName
MsgBox "シート '" & sheetName & "' を最後に作成しました。"
Else
MsgBox "シート '" & sheetName & "' は既に存在します。"
End If
End Sub
解説
After:=Worksheets(Worksheets.Count)を指定して、新しいシートを既存の最後のシートの後に作成します。
シート名を動的に指定して作成
ユーザー入力に基づいて、シート名を動的に指定して作成することも可能です。
【ユーザー入力でシート名を指定】
Sub CreateSheetWithUserInput()
Dim sheetName As String
sheetName = InputBox("新しいシート名を入力してください:")
If sheetName = "" Then
MsgBox "シート名が入力されませんでした。"
Exit Sub
End If
If Not SheetExists(sheetName) Then
Worksheets.Add.Name = sheetName
MsgBox "シート '" & sheetName & "' を作成しました。"
Else
MsgBox "シート '" & sheetName & "' は既に存在します。"
End If
End Sub
解説
InputBoxを使用してユーザーにシート名を入力させます。- 入力が空の場合は処理を終了します。
複数のシートをチェックして作成
複数のシートを一括でチェックし、存在しないシートだけを作成する方法です。
【複数シートをチェックして作成】
Sub CreateMultipleSheetsIfNotExists()
Dim sheetNames As Variant
Dim sheetName As String
Dim newSheets As String
sheetNames = Array("売上", "経費", "利益") ' チェックするシート名
newSheets = ""
For Each sheetName In sheetNames
If Not SheetExists(sheetName) Then
Worksheets.Add.Name = sheetName
newSheets = newSheets & sheetName & vbCrLf
End If
Next sheetName
If newSheets <> "" Then
MsgBox "以下のシートを作成しました:" & vbCrLf & newSheets
Else
MsgBox "すべてのシートが既に存在します。"
End If
End Sub
解説
- 配列
sheetNamesに作成するシート名を定義します。 - 存在しないシートだけを追加します。
シートの可視状態をチェックして再利用
非表示になっているシートがある場合は、そのシートを再利用し、存在しない場合のみ新しいシートを作成する方法です。
【非表示シートの再利用】
Sub ReuseOrCreateSheet()
Dim sheetName As String
Dim ws As Worksheet
sheetName = "非表示シート"
On Error Resume Next
Set ws = Worksheets(sheetName)
On Error GoTo 0
If ws Is Nothing Then
' シートが存在しない場合は作成
Set ws = Worksheets.Add
ws.Name = sheetName
MsgBox "新しいシート '" & sheetName & "' を作成しました。"
ElseIf ws.Visible = xlSheetHidden Then
' シートが非表示の場合は表示
ws.Visible = xlSheetVisible
MsgBox "シート '" & sheetName & "' を再利用しました。"
Else
MsgBox "シート '" & sheetName & "' は既に存在しています。"
End If
End Sub
解説
- 非表示状態のシートを
Visibleプロパティで確認し、表示状態に変更します。
注意点とベストプラクティス
- シート名の重複を防ぐ
Excel は同じ名前のシートを複数作成できません。必ずシートの存在を確認するコードを組み込みましょう。 - エラーハンドリング
シートが見つからない場合のエラーを防ぐために、On Error Resume Nextを使用します。ただし、エラー状態は確実にリセットしましょう。【VBA】On Error Resume Nextでエラーを無視してエラーの制御 - ユーザー入力の検証
ユーザーが無効なシート名を入力した場合に備えて、入力チェックを行うとさらに安全です。
まとめ
Excel VBA を使用して、シートが存在しない場合に作成する方法を以下のポイントで押さえましょう。
SheetExists関数を使ってシートの存在を確認する。Worksheets.Addメソッドで新しいシートを作成する。- 動的なシート名や複数シートを一括で処理する応用例を活用する。
- 非表示シートを再利用する工夫を加える。