人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセル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


●質問者: pocon
●カテゴリ:コンピュータ
✍キーワード:as DELETE name sub test
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● SALINGER
●20ポイント ベストアンサー

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

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でつなげりゃよかったんですね。勉強になりました。


2 ● Mook
●20ポイント

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

"シート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でした。

ありがとうございます。


3 ● 《み》
●20ポイント

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があんまし理解できてないんです。

勉強になります。

ありがとうございます。


4 ● Kenz
●20ポイント

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

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

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

◎質問者からの返答

なるほどです。

ありがとうございます。


5 ● van-dine
●20ポイント

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
◎質問者からの返答

おぉ。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ