• ベストアンサー

Excelマクロ シート名一覧からシート削除

Excelマクロで質問させてください。 任意のシートに記載されたシート名一覧を参照して、そこに記載されているシート名のシートを、ブック内から削除するマクロは作れますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>作れますでしょうか 作れます。ただし、エクセルVBAといわないで、マクロと言っているレベルの人には、推測ですが、経験不足で、できない(思いつかない)でしょう。すると丸投げしかない。 仕方なくコードの1例を書いておきましょう。 「コレクション」という考えと「For each」というものを使える点は、VBAを勉強しないと分らないと思う。 ーーー Sheet1のA列のA1:A3に 削除シート名 Sheet2 aaa (シート名の記述セル順序は問いません。CountIf関数利用のメリット) とあるとします。 削除するシート名です。削除シート名のあるSheet1に当たるものはこの削除リストにないものとします。 標準モジュールに Sub test01() Application.DisplayAlerts = False For Each sh In ActiveWorkbook.Sheets MsgBox sh.Name sn = sh.Name x = WorksheetFunction.CountIf(Worksheets("Sheet1").Range("a2:a10"), sn) MsgBox x If x > 0 Then sh.Delete End If Next Application.DisplayAlerts = True End Sub '非表示シートも出る。 と入れて実行します。 ただし(a2:a10")部分など修正が必要なことに気づかない人は、VBAでやるレベルではない。 少数例でやってみて、納得したら上記のコードのMsgBoxの行は削除してください。

YHappysoku
質問者

お礼

ご回答ありがとうございました。 「コレクション」「For each」等、学ばせていただきました。 削除するシートが多ければ、参照範囲のA2~A10の部分を変更すれば良いと理解しました。

その他の回答 (1)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは Sub test()   Dim tSh As Worksheet   Dim r As Range   Dim t As Range   '任意のシートをアクティブにして実行   Set t = Range("A1:A2") 'シート名一覧   Application.DisplayAlerts = False   On Error Resume Next   For Each r In t     If r <> ActiveSheet.Name Then       Set tSh = Nothing       Set tSh = Worksheets(r.Value)       If Not tSh Is Nothing Then         tSh.Delete       End If     End If   Next   On Error GoTo 0   Application.DisplayAlerts = True End Sub こんな感じでしょうか?

YHappysoku
質問者

お礼

ご回答ありがとうございました。 オブジェクトを格納するオブジェクト変数にはSetを用いるという所までは理解できました。 その後の部分の「もしリスト名とアクティブシート名が違うなら」以降で躓きました。 例えば、本質問と逆の「リスト名以外のシート名を削除する」を試そうとしてわからなくなってしまいました。