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

このQ&Aのポイント
  • エクセル2003を使用している場合、VBAを使用してシートの名前が重複する場合には、すでに存在する方を削除する方法を考えています。
  • 具体的には、入力シートをコピーして「DB」という名前の新しいシートを作成し、すでに「DB」シートが存在する場合には、そのシートを削除します。
  • また、削除する際には、もし「集計」シートや「名簿」シートが存在する場合には、一緒に削除しますが、存在しない場合でもエラーが発生しないように処理をする必要があります。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

>すでに「DB]シートがあれば「DB」シートを削除する。 >その時に、もし「集計」シートと「名簿」シートがあれば一緒に削除する 要するにDB,集計、名簿シートは削除するわけですから あるかないかを訊く必要はありません。 >集計シートや名簿シートはない場合もありますので、最初からdeleteにするとエラーになります。 エラーになるという正にそのことを利用すればいいでしょう。 '-----------------------------  Sub シートの挿入と削除()   On Error Resume Next   Application.DisplayAlerts = False     Worksheets("集計").Delete     Worksheets("名簿").Delete     Worksheets("DB").Delete   Application.DisplayAlerts = True   On Error GoTo 0   Worksheets("入力シート").Activate   ActiveSheet.Copy After:=ActiveSheet   ActiveSheet.Name = "DB" End Sub '------------------------------- 以上です。

mnhc33
質問者

お礼

すばらしい!コードも短くて簡単! 本当にありがとうございました。

その他の回答 (2)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

下記で同でしょう。 Sub シートの挿入と削除() Worksheets("入力シート").Activate Application.DisplayAlerts = False '警告メッセージを表示しない For Each sh In Worksheets If sh.Name = "DB" Then sh.Delete End If Next Application.DisplayAlerts = True 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 If End Sub

mnhc33
質問者

お礼

ありがとうございます。 これだとDBシート以外は削除されませんよね?

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

「○○と言うシートがあるかどうか」をFunctionにしてしまうのはどうでしょう。 「DB」も「集計」「名簿」もそのFunctionで有無を調べてあったら削除です。 Sub シートの挿入と削除()  '「DB」と言う名前のシートがあるか確認  If fSheetCheck("DB") = True Then   Application.DisplayAlerts = False '警告メッセージを表示しない   Sheets("DB").Delete   '「集計」と言う名前のシートがあるか確認   If fSheetCheck("集計") = True Then Sheets("集計").Delete   '「名簿」と言う名前のシートがあるか確認   If fSheetCheck("名簿") = True Then Sheets("名簿").Delete   Application.DisplayAlerts = True  End If  Worksheets("入力シート").Activate  ActiveSheet.Copy After:=ActiveSheet  ActiveSheet.Name = "DB" End Sub '*** 引数「sName」のシートがあればTrue、無ければFalseを返す Function fSheetCheck(sName As String) As Boolean  Dim ws As Worksheet  fSheetCheck = False  For Each ws In Worksheets   If ws.Name = sName Then    fSheetCheck = True    Exit For   End If   Next ws End Function

mnhc33
質問者

お礼

ありがとうございます。 まだまだ不勉強でFunctionにするというのがわかりません。 調べてみようと思います。

関連するQ&A

  • 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

  • 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が返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • エクセルVBAでワークシート削除

    ブックの中にある、表示されているシートで、たとえば図表1~図表4(何番まであるかは不定です)という名前のシートを削除するVBAを作りました。ただの「図表」という名前のシートや、「何々図表」、「図表集計」等のシートは削除しません。 Sub 保存図表削除() Dim SN As String For Each sh In Worksheets SN = sh.Name If sh.Visible And IsNumeric(Mid(SN, 3, Len(SN) - 2)) And Left(SN, 2) = "図表" Then ans = MsgBox(SN & "を削除してよい?", vbYesNo) If ans = vbYes Then Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True End If End If Next End Sub これでうまく作動するのですが、いちいちシートごとに削除の有無を聞かずに、削除するシート名をまとめて表示し、それらを削除するかしないかを聞くにはどうすればよいでしょうか? 「図表1,2,3,4があります。これらを削除しますか?」というような感じです。

  • 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シート毎削除なので、選択したシートを一括で削除出来るとうれしいです。 どなたかご存知の方お願いします。

  • 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

    こんばんは、VBAについて質問させてください(^O^) あるブックに32個のシートが入っています。 32個のシートのうち、セルA2にデータの入っているシートとそうでない シートがあります。(毎回変動します。) これを踏まえて、セルA2にデータが入っていればそのまま、 入っていなければそのシートを削除。 という作業をVBAでやろうと思って以下の通りVBAを記述したのですが、 シートが削除されるとシートの数が変わってしまうので、これではだめだと 思ったのですが、どのように記述すればいいのか分かりません(T_T) どなたかご教授いただけないでしょうか、よろしくお願いいたします。 Sub Macro1() Application.DisplayAlerts = False Dim i As Integer For i = 1 To 32 Sheets(i).Select If Range("A2").Value = "" Then Sheets(i).Delete End If Next i End Sub

  • ■シートを一つ削除するマクロを教えてください。

    前に、http://oshiete1.goo.ne.jp/qa4352149.html で質問させて頂きました。 その節は、お世話になりありがとうございました。 今回は、前回と似たようなものですが、 少々条件を変更したマクロを作成したいので ご協力のほど、何卒よろしくお願い致します。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 今度は例えば「SheetA」、「SheetB」、「SheetC」という 3つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 条件があり、「SheetC」は、マクロを有効にしないと使用できないようにしたいのです。 やり方をご存知の方、ご教示のほど 何卒よろしくお願い致します。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub

  • VBAで指定したSheetの削除

    お世話になります 指定したシート以外すべてのシートを削除させるボタンを作成したいのですが ↓こんなものを見つけました。(URLわからくなってしまった;;) これは図1~ワークシートを削除させるVBAらしいのですが ■解らないこと なぜかsheetにすると削除してくれません。 '指定以外ワークシート削除 Private Sub CommandButton1_Click() Dim myShe As Worksheet For Each myShe In Worksheets If myShe.Name <> Worksheets("図").Name Then myShe.Visible = Delete End If Next End Sub

  • VBAでEXCELのワークシートを削除時に警告メッセージをでないようにしたい。

    ACCESSのVBAでEXCELのワークシートを削除時に警告メッセージをでないようにしたいのですが、 ネットを参考に下記のようにしたのですが、  Application.DisplayAlerts = False  ActiveSheet.Delete  Application.DisplayAlerts = True DisplayAlertsが反転してメソッドまたはデータメンバが見つかりません。とエラーメッセージがでます。 ご存知の方宜しくお願いします。

専門家に質問してみよう