Excel VBAで新しいシートを追加したりコピーしたりする際、**既に同じ名前のシートが存在するとエラー(実行時エラー1004)**が発生します。
本記事では、同名シートエラーを回避するための対処方法を紹介します。
1. シート名の重複チェックを行う
事前に、同じ名前のシートが存在するかを SheetExists
関数で確認するのが基本です。
Function SheetExists(ByVal sheetName As String) As Boolean
On Error Resume Next
SheetExists = Not Worksheets(sheetName) Is Nothing
On Error GoTo 0
End Function
使用例:
Sub AddSheetSafe()
Dim newName As String
newName = "Report"
If SheetExists(newName) Then
MsgBox "シート「" & newName & "」は既に存在します。"
Else
Worksheets.Add.Name = newName
End If
End Sub
2. ユニークな名前を自動生成する
同じ名前のシートがあった場合に、番号を付けてユニークな名前を作る方法が便利です。
Function GetUniqueSheetName(ByVal baseName As String) As String
Dim i As Long
Dim uniqueName As String
uniqueName = baseName
i = 1
Do While SheetExists(uniqueName)
uniqueName = baseName & "_" & i
i = i + 1
Loop
GetUniqueSheetName = uniqueName
End Function
Sub AddSheetWithUniqueName()
Dim newSheetName As String
newSheetName = GetUniqueSheetName("Report")
Worksheets.Add.Name = newSheetName
MsgBox "シート「" & newSheetName & "」を作成しました。"
End Sub
3. コピー時のエラー回避
Worksheets("Data").Copy
でシートをコピーすると、コピー先のブックに同名シートがある場合エラーが発生します。
この場合も、コピー直後に新しいシートにユニーク名を付与する方法で回避できます。
Sub CopySheetSafe()
Dim baseName As String
Dim newName As String
baseName = "Data"
newName = GetUniqueSheetName(baseName)
Worksheets(baseName).Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = newName
MsgBox "シート「" & newName & "」としてコピーしました。"
End Sub
4. ユーザーに名前を入力させる方法
ユーザーにシート名を入力してもらい、既存シート名と重複していないか確認する方法もあります。
Sub AddSheetWithUserName()
Dim userInput As String
userInput = InputBox("新しいシート名を入力してください:")
If userInput = "" Then Exit Sub
If SheetExists(userInput) Then
MsgBox "シート「" & userInput & "」は既に存在します。"
Else
Worksheets.Add.Name = userInput
MsgBox "シート「" & userInput & "」を作成しました。"
End If
End Sub
5. まとめ
- 同名シートがあると
Worksheets.Add
やCopy
でエラーが出る SheetExists
で事前チェックするのが安全- 自動的に番号付きでユニークな名前を生成する方法が便利
コメント