• ベストアンサー

インプットボックスについて

指定したシートを削除するマクロを作っています。1つのシートを指定して削除するマクロはできたのですが、複数のシートを指定して削除するにはどうすればいいか分からなくて困っています。教えて下さい。 Sub 指定して削除() Application.DisplayAlerts = False Sheet = InputBox("削除したいシート名を入力して下さい。") Worksheets(Sheet).Delete Application.DisplayAlerts = True End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 実際に立ち上げると、入力例が出ますが、1-10 は、1~10まで、5,6 は、5と6のシート 2,5-10 は、2と5~10 です。 最後に、削除してよいかたずねてきますから、一度、確認してから削除してください。 現行のマクロでは、シート名は、数字型に限ります。 必ず、「標準モジュール」に入れてください。シートモジュールには入れないでください。 ----------------------------------------------------- Sub SheetDeleMac() Dim ret As Variant  ret = Application.InputBox("シート名の範囲を入れてください。" & vbCrLf & _  "入力例:1-10 または、5,6 または、2,5-10", "シート削除", Type:=2)  If VarType(ret) = vbBoolean Or ret = "" Then Exit Sub  '区切り文字の半角統一  ret = Replace(ret, "-", "-", , , 1)  ret = Replace(ret, ",", ",", , , 1)    If InputSplit(ret) = False Then   MsgBox "すべてのシートを削除することは出来ません。", vbCritical   ActiveSheet.Select   Exit Sub  End If  If MsgBox("選択したシートを削除してよいですか?", vbOKCancel + vbDefaultButton2) = vbOK Then   Application.DisplayAlerts = False     ActiveWindow.SelectedSheets.Delete   Application.DisplayAlerts = True  Else   ActiveSheet.Select  End If End Sub Function InputSplit(mStr As Variant)   Dim ar As Variant   Dim ar2() As Variant   Dim ar3() As Variant   Dim i As Integer   Dim j As Integer   Dim v As Variant   Dim n As Variant   Dim m As Integer   Dim sh As Variant   Dim tmp As Variant   Dim flg As Boolean   flg = True   ActiveWorkbook.ActiveSheet.Select   'カンマで切る   ar = Split(mStr, ",")   For Each v In ar     If InStr(v, "-") > 0 Then       For Each n In Split(v, "-")         ReDim Preserve ar2(i)         ar2(i) = n         i = i + 1       Next     Else       ReDim Preserve ar3(j)       ar3(j) = v       j = j + 1     End If   Next v   If UBound(ar2) = 1 Then     If Val(ar2(0)) > Val(ar2(1)) Then       tmp = ar2(0)       tmp = ar2(0): ar2(0) = ar2(1): ar2(1) = tmp     End If     ReDim ar(ar2(1) - 1)     For i = Val(ar2(0)) To Val(ar2(1))       ar(m) = i       m = m + 1     Next i   End If   On Error Resume Next   For Each sh In ar     ActiveWorkbook.Worksheets(sh).Select flg     flg = False   Next   For Each sh In ar3     ActiveWorkbook.Worksheets(sh).Select flg     flg = False   Next   If ActiveWindow.SelectedSheets.Count = ActiveWorkbook.Worksheets.Count Then     InputSplit = False   Else     InputSplit = True   End If   On Error GoTo 0 End Function

noa8998
質問者

お礼

いつもありがとうございます。 こんな高度なマクロどう考えてもわかりませんでした。 本当にありがとうございます。

その他の回答 (7)

  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.8

思い切って This Workbook に以下のコマンドを実装し、削除したいシートのどこかを2回ダブルクリックすると削除できるようにするのはいかがでしょうか Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Application.DisplayAlerts = False ActiveWindow.SelectedSheets.Delete End Sub

noa8998
質問者

お礼

こういうやり方もあるんですね。すごく勉強になりました。ありがとうございました。

  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.6

ANo.5は誤りでした。テスト済みコードを以下に載せます 1. ThisWorkBook に以下を挿入 Private Sub Workbook_Open() MsgBox ("Ctrlを押しながらクリックして削除するシートを選んでください" & vbCrLf & "選択が終わったらCtrl+Alt+D を押すと選択したシートが削除されます。") Application.OnKey "^%d", "DelSheets" Application.OnKey "^%D", "DelSheets" End Sub 2. Module1 として以下を記述 Sub DelSheets() Application.DisplayAlerts = False ActiveWindow.SelectedSheets.Delete End Sub でいかがでしょうか? シート名をいちいち入力するのはチョット面倒ですので

  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.5

Sub Macro1() Application.DisplayAlerts = False Ans = MsgBox("削除するシートをCtrlを押しながらクリックしてください" & crlf & "選択が完了したらOKを押してください", vbOKOnly) If Ans = vbOK Then ActiveWindow.SelectedSheets.Delete End If End Sub

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

>削除するシートが多いのですが、印刷するときのように「1-10」というような入力の仕方で一度で1~10のシートを >削除というようにできないでしょうか? シート名とシートの配列がどのようになっているのかわかりませんが、 削除したいシートタブをCtrlキーを押しながら左クリックしていき、 右クリックの削除ではダメなのですか? 「1-10」がシート名を示すのか左からの順番を示すのかにもよりますけど。

noa8998
質問者

補足

1、10は実際のシート名です。 >削除したいシートタブをCtrlキーを押しながら左クリックしていき、 右クリックの削除ではダメなのですか? この操作ができない人もいるので、マクロでできないかなぁと思いまして・・・

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

ANo.2です。 ちょっとミスりました。 v = Application.InputBox("削除したいシート名を[,、]で区切って入力して下さい", 2) を v = Application.InputBox("削除したいシート名を[,、]で区切って入力して下さい", Type:=2) に置き換えて下さい。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

都度確認しなくても良ければ、 Sub test() Dim ws As Worksheet Dim i As Integer Dim v, vv v = Application.InputBox("削除したいシート名を[,、]で区切って入力して下さい", 2) If v = False Then Exit Sub vv = Split(Replace(v, "、", ","), ",") Application.DisplayAlerts = False For i = 0 To UBound(vv) Worksheets(vv(i)).Delete Next Application.DisplayAlerts = True End Sub ご参考程度に。

noa8998
質問者

お礼

削除枚数が少ないものに使わせていただきます。ありがとうございました。

noa8998
質問者

補足

削除するシートが多いのですが、印刷するときのように「1-10」というような入力の仕方で一度で1~10のシートを削除というようにできないでしょうか?

  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.1

Sub 確認しながら削除() Application.DisplayAlerts = False For i=1 to worksheets.count If i > Worksheets.Count then Exit Sub Sheet_Name=Worksheets(i).name Ans=Msgbox("シート" & Sheet_Name & "を削除しまか?",vbYesNo) If Ans=vbYes then Worksheets(i).delete Next i End Sub

noa8998
質問者

補足

削除するシートが多いのですが、印刷するときのように「1-10」というような入力の仕方で一度で1~10のシートを削除というようにできないでしょうか?

関連するQ&A

  • エクセル2003 シートを保護するとマクロエラー

    sub macro1()  worksheets("Sheet2").copy before:=worksheets(1)  with worksheets(1)   .range("D4:BH14").interior.colorindex = xlnone   .range("D16:BH21").interior.colorindex = xlnone   .printout  end with  application.displayalerts = false  worksheets(1).delete  application.displayalerts = true end sub 以前に、こちらの質問で回答をいただきました。 会社のプリンターは古すぎなのですが、 見事!なんとか、会社のプリンターでできました。 入力されたくないセルもあり、シートを保護しました。 すると、マクロにエラーがかかりました。 なるべく、触られたくないセルがあったり、データを入力してほしいデータもあり… セルの保護をかけながら、マクロを有効に動かしたく思います。 よろしくお願いします。

  • VBA2003: 選択された複数シートを削除したい

    複数のワークシートを選択した状態で、次のマクロを動かすと1つのシートしか削除されません。 選択した全てのワークシートを削除したいのですが、コードのどこが間違っているのでしょうか。 Sub TOOL1() Dim objWs As Worksheet Application.DisplayAlerts = False For Each objWs In ActiveWindow.SelectedSheets objWs.Delete Next Application.DisplayAlerts = True End Sub

  • VBA 選択したセルが空白であったらシートを削除

    こんばんは!いつもお世話になっています。 選択したシート1のセル(C9)が空白であったら、選択したシートを削除するマクロ(VBA)を作りましたが、上手く作動しなくて困っています。 どうしたらよいのかよろしくお願い致します。 'シート1のセルC9を選択し、空白か判断する Sub セルの選択()   Worksheets("Sheet1").Activate   Range("C9").Select  If Len(Application.Trim(ActiveCell)) = 0 Then   MsgBox("空白セル")  End If End Sub '現在アクティブなシートを削除する Sub DeleteWorksheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

  • INPUT関数で入力した日付でワークシートとセルに値をいれる。

    こんにちは、最近VBAを勉強し始めたのですが、 躓いてしまいました。 すでにあるワークシートからINPUT関数で”20101016”を入力して ワークシートをコピー(シート名は”20101016”)する事はできたのですが このシートに”2010年 10月 16日 (曜日)”を表示する事ができないのです。 指定したセルには”20101016”が入っているのですが 表示が"###################”になってしまいます。 (”負の日付又は時間は###の表示になります。”の意味がわかりません。) 書式設定で日付等をいじっても変化がありません。 どなたか、ご教示願います。 Sub 新規シート() Dim tuki As String ActiveSheet.Copy after:=ActiveSheet   'アクティブシートの後ろへコピーを作る。 Range("a46:r57").Select   'コピー元の値を削除 Selection.ClearContents Range("a1").Select tuki = InputBox("日付を半角英数字で入力してください。" & Chr(13) & _ "yyyymmdd 形式で入れてね!", "日付入力")   'tukiに8桁を入力 If tuki = "" Then Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True   '入力が無い場合、作成したシートを削除 Else On Error Resume Next ActiveSheet.Name = tuki   '新規ワークシート名に”tuki”を代入 Range("d6").Value = tuki  ’ここが問題! If Err.Number = 1004 Then MsgBox "日付が重複しています。" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True   'シート名が重複した場合、警告後に削除 End If End If End Sub

  • Excelマクロにてシートの削除を行いたいです。

    初めて投稿させて頂きます。 質問内容  Excelのマクロを使用して指定シート以外のシートの削除を行いたいです。 前条件  外部CSVファイルを取込み、データによってシートを追加して振り分けています。  再度マクロを実行した場合特定のシートを残し(フォーマット等)、他のシートを削除してからデータの振り分けを実施する予定です。 やってみた事  下記の様に書いて実施してみたのですがエラーとなってしまいます。 Sub Clear()   Application.DisplayAlerts = False   For I = 1 To Worksheets.Count     If (Worksheets(I).Name <> "sheet") Then       Sheets(Worksheets(I).Name).Select       ActiveWindow.SelectedSheets.Delete     End If   Next I   Application.DisplayAlerts = True End Sub 上記の書き方だと1シート毎削除なので、選択したシートを一括で削除出来るとうれしいです。 どなたかご存知の方お願いします。

  • Excel VBAでのシートの削除について

    Excel VBAで、シート上に配置されたボタンをクリックすることで、メッセージを出さずにそのシートの削除をしたいと思っています。 サンプルとして、シート上(例えばSheet1)にボタンを1個配置し、 ------------------------------------------------------- Private Sub CommandButton1_Click() Application.DisplayAlerts = False Delete Application.DisplayAlerts = True End Sub ------------------------------------------------------- のようにすると、オートメーションエラーが起きます。 そこで、 Application.DisplayAlerts = True をコメントアウトしてやれば実行はできるのですが、その後別のシートで処理を行う場合には、再度メッセージを表示してほしいと思っています。 ためしに、Sheet1削除後にアクティブになるSheet2に次のようなコードを記述しました。Sheet1同様、シート上にボタンを1個配置しています。 ------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox Application.DisplayAlerts End Sub Private Sub Worksheet_Activate() MsgBox "次に出るメッセージはアクティブ直後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts Application.DisplayAlerts = True MsgBox "次に出るメッセージは変更後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts End Sub ------------------------------------------------------- こうすれば、Sheet1削除後、アクティブになった直後はDisplayAlertsがFalse。その後設定変更してTrueになるかとおもったのですが、結果はFalseでした。しかしその後、ボタンをクリックするとTrueが返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • Excelマクロについての質問です。

    Excelのマクロについての質問です。 マクロについての質問です。 以下のようなマクロを作成しました。 このマクロを動作させているのはこのマクロを作成したファイル上です。 Sub Macro9() Dim WBA As Workbook Dim WBB As Workbook Dim WSA As Worksheet Dim WSB As Worksheet Set WBA = Workbooks("A") Set WBB = Workbooks("B") Set WSB = WBB.Worksheets("1") For i = 100 To 3000 Step 20 Worksheets.Add Before:=Worksheets("Sheet1") Dim k As String k = i ActiveSheet.Name = (k / 100) Set WSA = WBA.Worksheets(k / 100) WSB.Range("A1:AY30").Copy Destination:=WSA.Range("A1") WSA.Range("D4:I30").Clear WSA.Range("Q4:V30").Clear WSA.Range("AD4:AI30").Clear WSA.Range("AQ4:AV30").Clear Next i Application.DisplayAlerts = False Sheets("Sheet1").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet2").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet3").Delete Application.DisplayAlerts = True End Sub そこで質問ですが、このマクロを作動させると何のエラーの表示もなく最後まで動作は完了します。 ですが、シートの作成は30まで作成できてもその後のセルのコピー&ペーストはなぜかシート6.8までしかできていません(7~30までのシートはシート作成はできているのですがコピペのみが実行されず空白のままになっています。) シートもコピペも両方ともシート30まで完了するにはどの点を改善すればいいのでしょうか? 知恵が足りずどうしても直す事が出来ません。 長文申し訳ございませんが是非皆さまのお知恵をお貸しください。 宜しくお願い致します。

  • VBA シートの名前が重複するときに すでにある方を削除する

    VBA シートの名前が重複するときに すでにある方を削除する よろしくお願いします。 エクセル2003を使っています。 「入力シート 」をコピーして「DB」という名前をつける。 すでに「DB]シートがあれば「DB」シートを削除する。 その時に、もし「集計」シートと「名簿」シートがあれば一緒に削除する というコードを考えています。 集計シートや名簿シートはない場合もありますので、最初からdeleteにするとエラーになります。 どうぞお知恵をお貸しください。 sub シートの挿入と削除 () Worksheets("入力シート").Activate ActiveSheet.Copy After:=ActiveSheet On Error Resume Next 'エラーが発生しても続行 ActiveSheet.Name = "DB" If Err.Number = 1004 Then Application.DisplayAlerts = False '警告メッセージを表示しない Sheets("DB").Delete Application.DisplayAlerts = True ActiveSheet.Name = "DB" End Sub End If

  • ExcelVBA SET Worksheets(

    お世話になります 済みません お馬鹿質問だ とは、思うのですが お許し下さい 下記の、箇所で 実行時エラー '438': オブジェクトは、このプロパティまたはメソッドをサポートしていません に。なります 何故で、しょうか? 宜しく、お願いします。                記 Sub Main() Dim 現状保存 As Worksheet, シート名 As String Application.ScreenUpdating = False Set 現状保存 = Worksheets.Add() Set Ws = Worksheets.Add() Application.ScreenUpdating = True Let シート名 = ActiveSheet.Name Set 現状保存 = ActiveSheet ~~~中略~~~ Set Worksheets(シート名) = 現状保存 ← 此所です Application.DisplayAlerts = False 現状保存.Delete Ws.Delete Application.DisplayAlerts = True End Sub 以上

  • マクロ シート削除の記述確認願います

    いつも回答して頂き、感謝しています。 ネットで調べながら、使えそうな記述を少し修正し、シート削除のマクロを記述してみました。 削除するシートの対象は、別のシートに一覧で載せてあります。 ちなみに、シートを挿入する時も、上記で参照する一覧を参照して作ってあります。 こんな場合もあるから、こんな感じに記述した方がいいよって意見がありましたら、教えてください。宜しくお願い致します。 Sub 作業名別のシートを削除する() Dim h As Range On Error Resume Next Application.DisplayAlerts = False With Worksheets("作業名一覧") .Activate For Each h In .Range(.Range("B2"), Range("B65536").End(xlUp)) Worksheets(h.Value).Delete Next End With Application.DisplayAlerts = True End Sub

専門家に質問してみよう