各シートの有無をチェックして、有れば削除、なければマクロを実行という形にしたいのですがうまくいきません。
足りない記述をご教授ください。(同じ挙動が出来れば、以下にこだわりません)
※現状ではエラーになります。
Sub test()
Dim WS As Worksheet
If WS.Name = "シートA" Then
WS.Delete
Else
If WS.Name = "シートB" Then
WS.Delete
Else
If WS.Name = "シートC" Then
WS.Delete
End If
マクロ
End Sub
こんな感じになるでしょうか。
Option Explicit Sub Macro1() Dim ws As Worksheet Application.DisplayAlerts = False For Each ws In Worksheets If ws.Name = "シートA" Or ws.Name = "シートB" Or ws.Name = "シートC" Then If Worksheets.Count > 1 Then ws.Delete Else MsgBox "最後のワークシートは削除できません" End If End If Next Application.DisplayAlerts = True End Sub
最後のシートは削除できないのと、削除するときの確認ダイアログは開かないようにしています。
こんな感じになるでしょうか。
Option Explicit Sub Macro1() Dim ws As Worksheet Application.DisplayAlerts = False For Each ws In Worksheets If ws.Name = "シートA" Or ws.Name = "シートB" Or ws.Name = "シートC" Then If Worksheets.Count > 1 Then ws.Delete Else MsgBox "最後のワークシートは削除できません" End If End If Next Application.DisplayAlerts = True End Sub
最後のシートは削除できないのと、削除するときの確認ダイアログは開かないようにしています。
なるほど。
orでつなげりゃよかったんですね。勉強になりました。
「有れば削除、なければマクロを実行」というのは、 ブックの中に
"シートA", "シートB", "シートC"がどれかあった場合は
(1)それをすべて削除するのでしょうか
(2)最初に見つかったどれか一つだけを削除するするのでしょうか
提示されたコードは If ~ Else ~ End If の形式ですので(2)に相当しますが
希望されるケースは(1)のようにも思えます。
(それとも複数あることはないのでしょうか?)
(1)の場合は下記のようになります。
"シートA", "シートB", "シートC"に該当するものがあればすべて削除し、
削除処理が行われなかった場合のみ、マクロを実行します。
Sub testAll() Dim WS As Worksheet Dim isExists As Boolean isExists = False For Each WS In Worksheets Select Case WS.Name Case "シートA", "シートB", "シートC" Application.DisplayAlerts = False WS.Delete Application.DisplayAlerts = True isExists = True End Select Next If isExists = False Then マクロ End If End Sub
(2)の場合は下記のようになります。
ただし、これは"シートA", "シートB", "シートC"のどれか一つを削除して終了するので、
複数あった場合は、他のシートは残ります。
Sub testAny() Dim WS As Worksheet For Each WS In Worksheets Select Case WS.Name Case "シートA", "シートB", "シートC" Application.DisplayAlerts = False WS.Delete Application.DisplayAlerts = True Exit Sub End Select Next マクロ End Sub
ご希望の仕様が異なる場合は、コメントにて対応しますのでコメントを有効にしてください。
言葉足らずで申し訳ありません。
1でした。
ありがとうございます。
Worksheets(i)などでForループ/Fore Eachループをかまさないとだめなんでは?
Sub Text() Dim i As Integer Dim ws As Worksheet i = 1 Do While i <= Worksheets.Count Set ws = Worksheets.Item(i) If ws.Name = "XXX" Then ws.Delete Else i = i + 1 End If Loop End Sub
forがあんまし理解できてないんです。
勉強になります。
ありがとうございます。
当方、エクセルは持ってないので、動作検証はしてませんが、こんな感じかと思います。
ちなみに、提示のソースは
変数WS に値を入れていないためのエラーだと思われます。
Sub test()
On Error GoTo Error
Dim checkSheet As Worksheet
Dim isMacroRun as Boolean
isMacroRun = True
For Each checkSheet In ActiveWorkbook.Sheets
If checkSheet.Name = "シートA" Then
ActiveWorkbook("シートA").Delete
isMacroRun = False
ElseIf checkSheet.Name = "シートB" Then
ActiveWorkbook("シートB").Delete
isMacroRun = False
ElseIf checkSheet.Name = "シートC" Then
ActiveWorkbook("シートC").Delete
isMacroRun = False
End If
Next checkSheet
If isMacroRun
マクロ
End If
Exit Sub
Error:
MsgBox "エラー:" & Err.Number & vbNewLine & Err.Description
End Sub
なるほどです。
ありがとうございます。
Forループ処理を使った書き方。
Sub Sheet(Name As String) Dim I As Worksheet For Each I In Sheets If I.Name = Name Then マクロ Next End Sub
エラー処理を使った書き方。
Sub Sheet(Name As String) Dim WS As Worksheet On Error Resume Next Set WS = Sheets(Name) If Err.Number = 0 Then マクロ On Error GoTo 0 End Sub
おぉ。
複数パターンでありがとうございます。
なるほど。
orでつなげりゃよかったんですね。勉強になりました。