どうもマサヤです!
今日は、VBAでシートの存在を確認してから削除や追加をするコードを紹介します。
再利用できるようにシート名を指定するだけで使えるようにしています。
「コード説明は不要だよ~ サクッとコードだけ知りたい!」
そういうあなたは、目次の【これをコピペ!】・・・をクリックしてくださいね。
シートの存在確認はFor Eachは使わず、例外処理で!
下記コードのように、一般的なシートの存在確認はFor Eachを使い、全シートをループさせて目的シートがあるかを確認します。
Sub SheetExists()
Dim s As Worksheet
Dim find_name As String
Dim flg As Boolean
find_name = "Sheet1"
For Each s In ThisWorkbook.Worksheets
If s.Name = find_name Then
flg = True
Exit For
End If
Next
If flg = True Then 'Trueならシート存在している
Debug.Print find_name & "は存在しています。"
End If
End Sub
これでも問題ありませんが、多数のシートがある場合ちょっと遅くなります。
そこで今回紹介するコードでは、例外処理の特性を使ってシートの存在確認をしています。
このコードであればピンポイントで目的シートの存在確認ができ無駄がありません。
例外処理を使ったシート存在確認のコード
例外処理を使ったコードはこちらです!
Sub SheetExists()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
On Error Resume Next
Set ws = wb.Worksheets("Sheet1") '←存在確認したいシートを指定
On Error GoTo 0
If Not ws Is Nothing Then 'Nothingならシートが存在しない
Debug.Print ws.Name & "は存在しています"
End If
End Sub
この手法はStack OverflowでTim Williamsさんが紹介しているコードです。
コードのポイント
このコードのポイントは2つです。
① On Error Resume Next を使うことで、set ws = wb.Worksheets(“Sheet1”) でエラーが発生しても、次のコードを実行させています。
② Not ws in Nothingを使うことで、wsがNothing(存在していない)でも、エラーなく処理されるようにしています。
【これをコピペ!】煩雑にしないため関数にしました
上記のコードをメイン関数と同じにすると、例外処理が煩雑になります。
別で関数化したほうが間違いなく使いやすいので2パターンの関数を作成しました!
お好きにコピペしてお使いください。
シートの存在を確認するコード
Function SheetExists(name As String) As Boolean Dim wb As Workbook Dim ws As Worksheet Set wb = ThisWorkbook On Error Resume Next Set ws = wb.Worksheets(name) On Error GoTo 0 SheetExists = Not ws Is Nothing End Function
説明不要かと思いますが、下記コードにて実行できます。
flg = SheetExists("Sheet5") ' ←存在確認したいシートを指定
戻値がTrueならシートが存在している、 Falseならシートが存在していない。
シートの削除・追加もしてくれるコード
Sub SheetExistsToDeleteAndAdd(name As String) Dim wb As Workbook Dim ws As Worksheet Set wb = ThisWorkbook On Error Resume Next Set ws = wb.Worksheets(name) On Error GoTo 0 If Not ws Is Nothing Then 'Nothingならシートが存在しない Application.DisplayAlerts = False ws.Delete 'シート削除 Application.DisplayAlerts = True End If wb.Worksheets.Add(Worksheets(1)).name = name '一番手前にシート追加して、シート名を変更 End Sub
VBAを実行する度にシートの削除・作成(初期化に近い)をしたい場合に使えます。
あと、関数名がダサいのでアナタの好きな名前に変えてください)笑
まとめ
いかがでしたでしょうか?
シート数が多い場合はこちらのコードのほうが便利で速いですよ。
よければ、使ってみてくださいね!
コメント