エクセルVBAの質問です。


各シートの有無をチェックして、有れば削除、なければマクロを実行という形にしたいのですがうまくいきません。
足りない記述をご教授ください。(同じ挙動が出来れば、以下にこだわりません)

※現状ではエラーになります。

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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/02/27 00:50:01
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

ポイント20pt

こんな感じになるでしょうか。

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

最後のシートは削除できないのと、削除するときの確認ダイアログは開かないようにしています。

id:pocon

なるほど。

orでつなげりゃよかったんですね。勉強になりました。

2009/02/27 00:45:33

その他の回答4件)

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969ここでベストアンサー

ポイント20pt

こんな感じになるでしょうか。

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

最後のシートは削除できないのと、削除するときの確認ダイアログは開かないようにしています。

id:pocon

なるほど。

orでつなげりゃよかったんですね。勉強になりました。

2009/02/27 00:45:33
id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント20pt

「有れば削除、なければマクロを実行」というのは、 ブックの中に

"シート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

ご希望の仕様が異なる場合は、コメントにて対応しますのでコメントを有効にしてください。

id:pocon

言葉足らずで申し訳ありません。

1でした。

ありがとうございます。

2009/02/27 00:46:50
id:m6u No.3

回答回数82ベストアンサー獲得回数6

ポイント20pt

 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
id:pocon

forがあんまし理解できてないんです。

勉強になります。

ありがとうございます。

2009/02/27 00:47:54
id:kenz-firespeed No.4

回答回数104ベストアンサー獲得回数3

ポイント20pt

当方、エクセルは持ってないので、動作検証はしてませんが、こんな感じかと思います。

ちなみに、提示のソースは

変数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

id:pocon

なるほどです。

ありがとうございます。

2009/02/27 00:48:27
id:van-dine No.5

回答回数108ベストアンサー獲得回数11

ポイント20pt

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
id:pocon

おぉ。

複数パターンでありがとうございます。

2009/02/27 00:49:11
  • id:SALINGER
    書き忘れましたが、エラーの原因は宣言したWSにシートを代入するコードが無いからということになります。
    For Eachを使うと全てのシートを1つずつ代入するという処理になります。
  • id:kenz-firespeed
    はてなの使い方がよく分からず、
    ソースコードが見づらくてごめんなさい。
  • id:SALINGER
    みんなコードを書くときに
    >|vb|
    ||<
    >||
    ||<
    >>
    <<
    >|
    |<
    を使い分けてるみたいですよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません