はじめに
新たにシートを追加したい時、もし同じ名前のシートがある場合エラーとなってしまいます。このような時は予め同じシート名がないか確認する必要がありますが、ここでは2つの方法を紹介します。
一つは今あるシートを巡回して既に同じシートがあるかを調べる方法。もう一つはワークシート変数にそのシート名を代入してエラーとなるかを見て見つける方法です。
シートを巡回して調べる方法
For Each In でワークシートを巡回し名前を検索して既にあるかを調べます。
Sub searchSheet1()
Dim shName As String
shName = "Sheet1"
Dim sh
For Each sh In Worksheets
If sh.Name = shName Then
MsgBox shName & "は既にあります。"
Exit Sub
End If
Next sh
MsgBox shName & "はありません。"
End Sub
ワークシート変数してエラーになるかで調べる方法
ワークシート変数に代入してみてエラーとなれば、そのシート名がは使われていない事になります。
Sub searchSheet2()
Dim shName As String
shName = "Sheet1"
Dim sh As Worksheet
On Error Resume Next
Set sh = Worksheets(shName)
On Error GoTo 0
If sh Is Nothing Then
MsgBox shName & "はありません。"
Else
MsgBox shName & "は既にあります。"
End If
End Sub
シート名一覧のシートがあるか調査する
シート名の一覧があり、一覧のシートが揃っているか調べるようなプログラムを想定します。
Sub addNewSheet()
Dim i As Long
Dim sh As Worksheet
Dim sName As String
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Set sh = Nothing 'ここで初期化が必要です。
On Error Resume Next
sName = Cells(i, "A")
Set sh = Worksheets(sName)
On Error GoTo 0
If sh Is Nothing Then
Debug.Print sName & "シートはありません。"
Else
Debug.Print sName & "シートは既にあります。"
End If
Next i
End Sub
上記のプログラムはアクティブシートのA列にシート名一覧があり、その通りシートが揃っているかを調査するプログラムです。
On Error Resume Next ~ On Error GoTo 0 を使う場合は、巡回の際、シートオブジェクト変数を初期化するのを忘れないようにましょう。Set sh = Nothing がないとそれまでの値が居残るため上手く動作しません。
まとめ
1つ目の方法はワークシート名を全て巡回して探す方法。2つ目はワークシート変数(オブジェクト変数)に値を代入してみてエラーになるか否かを調査する方法です。
1つ目は、もしワークシートがたくさんあるのであれば、巡回して探す方法は時間がかかりそうですが、数百のワークシートがあるようなケースはまず無いと思われますので、不自由するほど遅くはならないかと思います。
2つ目の方法では、ワークシート変数に代入していますので、Setを忘れないように気を付けましょう。尚、巡回して連続で調査する場合は、3つ目の方法のようにオブジェクト変数の初期化を必要になりますので注意してください。
参考にしていただければ幸いです。
コメント