
いつもたくさんのお知恵を貸してもらっています。
今回もよろしくお願いいたします。
ブックの構成は下記のとおりです。
Sheet1⇒名簿
Sheet2⇒チームメンバー表
Sheet3⇒営業月報の原版
Sheet3の原版はSheet2のメンバー表をもとにシート名にメンバーの氏名を使ってチームメンバーの分だけ自動で複製(シート名にメンバーの名前を反映)していくようにVBA処理しています。
この処理を終了した後に、上記のSheet1~Sheet3以外の複製したSheetのみをVBAで一括削除する方法はないでしょうか?
教えてください、よろしくお願いします。
No.4ベストアンサー
- 回答日時:
こんばんは。
最初に、シートを表す名称について説明しておきます。
1. シート名(Worksheets("Sheet1") のSheet1 の部分)
2. シート・インデックス (Worksheets(i) で、i は、1~シートの数まで)
左から右に行くのが、シート・インデックスです。
3. シート・オブジェクト名(CodeMame)
それで、1は、ユーザー任意で替えられてしまいます。2.は、順序が変わると、インデックスが変わってしまいます。3.は、VBEditor の中で、
左の窓に、「プロジェクト」ウィンドウが出ていたら、そのVBAProject の中を開くと
Sheet1(Sheet1)
Sheet2(Sheet2)
Sheet3(Sheet3)
オブジェクト名(シート名)
となっているはずです。そこで、シート名を変えても、オブジェクト名は変わらないはずです。それを利用するわけです。
>Sheet1:チームのメンバー表
>Sheet2:名簿
>Sheet3:目標金額のベースとなる予算表
>Sheet4:月報の原版
VBEditor の中を確認してみてください。
このオブジェクト名(CodeName) を変更する場合は、プロパティ(通常は、プロジェクト・ウィンドウの下--出ていない場合は、メニューの表示(V)で、プロパティ ウィンドウをクリックしてください)kで、(オブジェクト名)のところを手動で書き換えてあげます。
If Not .Worksheets(i).CodeName Like "Sheet[1-4]" Then
は、たぶん、オブジェクト名との食い違いがあるのだと思います。
Wendy02さん、こんばんは。
ご丁寧な解説をしていただき、ありがとうございました。
プロパティの修正で解決できました。
綺麗に作成分だけ削除できて非常に使い勝手が向上しました。
本当にありがとうございました。
助かりました。
No.3
- 回答日時:
こんにちは。
少し、イレギュラーな内容だと思います。そのまますんなりとは行きませんね。
>Sheet3の原版はSheet2のメンバー表をもとにシート名にメンバーの氏名を使ってチームメンバーの分だけ自動で複製(シート名にメンバーの名前を反映)していくようにVBA処理しています。
>この処理を終了した後に、
ということですと、シート削除に際し、シート・インデックス番号でとるのは実にあいまいです。シート名は変更されてしまうので、シート名は使えないように思います。この場合はオブジェクト名(CodeName)を使用します。一般的には、Sheet1~Sheet3 という、シート名と同じオブジェクト名になっていますが、オブジェクト名は、通常、マニュアルでしか変更しません。
ここでは、あえて、オブジェクト名はシート名と同じものにさせて処理させていただきます。本来は、一意で名前を変更しておくのがよいかと思います。シート名は変更されても、VBAでは、そのまま使用できます。使用前には、必ず、シートプロパティを確認しておくほうがよいです。オブジェクト名は、シート名とは必ずしも同じではありません。
なお、仕事で使う場合は、必ずダイアログで、ユーザーに確認を取るように作ります。また、該当しない場合は、マクロは抜けるように作ります。
標準モジュールのみ
'-------------------------------------------------
Sub Test1()
Dim i As Integer
Dim flg As Boolean
flg = True
With ActiveWorkbook
For i = 1 To .Worksheets.Count
If Not .Worksheets(i).CodeName Like "Sheet[1-3]" Then
.Worksheets(i).Select flg
flg = False
End If
Next i
If flg Then
MsgBox "該当するシートが見当たりません。", vbInformation
.Worksheets("Sheet1").Select
Exit Sub
End If
If MsgBox("選択されたシートを削除します。よろしいですか?", vbOKCancel) = vbCancel Then
.Worksheets("Sheet1").Select
Exit Sub
End If
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
.Worksheets("Sheet1").Select
End With
End Sub
ありがとうございます。
>ということですと、シート削除に際し、シート・インデックス番号でとるのは実にあいまいです。シート名は変更されてしまうので、シート名は使えないように思います。この場合はオブジェクト名(CodeName)を使用します。一般的には、Sheet1~Sheet3 という、シート名と同じオブジェクト名になっていますが、オブジェクト名は、通常、マニュアルでしか変更しません。
>ここでは、あえて、オブジェクト名はシート名と同じものにさせて処理させていただきます。本来は、一意で名前を変更しておくのがよいかと思います。シート名は変更されても、VBAでは、そのまま使用できます。使用前には、必ず、シートプロパティを確認しておくほうがよいです。オブジェクト名は、シート名とは必ずしも同じではありません。
すいません、理解しきれませんでした。
実はSheet1~3以外に新たに4枚目を追加しました。
内容は営業月報の目標金額のベースとなる予算表です。
番号順にいくと、
Sheet1:チームのメンバー表
Sheet2:名簿
Sheet3:目標金額のベースとなる予算表
Sheet4:月報の原版
という構成になっております。
記載の通りにVBEにコピーして、If Not .Worksheets(i).CodeName Like "Sheet[1-3]" Then の部分は"Sheet[1-4]" に変更して実行したのですが、Sheet4まで消えてしまいます。(月報の原版)
ダイヤログの表示等は非常にありがたい機能なので、使わせていただきたいのですが、Sheet1から4まで残して削除するにはどのようにすればできるでしょうか?
私が理解しきれず、すいません。
No.2
- 回答日時:
こんなのでは?
Sub sample()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
Select Case sh.Name
Case "Sheet1", "Sheet2", "Sheet3"
Case Else
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
End Select
Next
End Sub
No.1
- 回答日時:
こんばんは。
こんな感じでいかがでしょう?Dim i As Long
Dim DeleteSheet() As String
ReDim DeleteSheet(0)
For i = 1 To Application.Worksheets.Count
If Worksheets(i).Name = "Sheet1" Or _
Worksheets(i).Name = "Sheet2" Or _
Worksheets(i).Name = "Sheet3" Then
Else
ReDim Preserve DeleteSheet(UBound(DeleteSheet) + 1)
DeleteSheet(UBound(DeleteSheet)) = Worksheets(i).Name
End If
Next
Application.DisplayAlerts = False
For i = 1 To UBound(DeleteSheet)
Worksheets(DeleteSheet(i)).Delete
Next
Application.DisplayAlerts = True
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Visual Basic(VBA) VBAでvlookup関数から、別シート参照するやり方・・・ 2 2022/11/14 18:49
- Visual Basic(VBA) VBA Userform転記のみ編集可 1 2023/06/29 11:03
- Excel(エクセル) Excelにて、行の最後のセルの値をコピーして別sheetに張りつけるVBAコードをご教授願います 3 2022/11/20 14:35
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Visual Basic(VBA) VBA active sheetをPDF化して指定フォルダに保存 1 2022/07/07 11:27
- Visual Basic(VBA) このプログラムなんですがsheetにデータを置いて表示できるようにしてありますがsheetに101を 2 2023/02/23 20:13
- Excel(エクセル) エクセルカレンダーに予定表を反映したいです。 6 2022/09/30 14:39
- Excel(エクセル) Excel 売上管理シートに入力した売上データを、日報に自動反映させたいと考えています。 売上管理シ 3 2023/04/29 18:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】シートの変数へ入れ...
-
エクセルで複数のシートをフォ...
-
Excel複数シートから日付と文字...
-
BRIDEのシート張り替えってでき...
-
カッティングシートの上からア...
-
フォルツァ バッテリーを外して...
-
IHクッキングヒーターの操作パ...
-
XR250BAJAのシートのはずし方を...
-
【至急】球体に貼り付ける模様...
-
ポップコーンの捨て方
-
エスティマのコンソールボック...
-
飛行機の座席について 3列シー...
-
2024年式タフトに乗っています...
-
BIKEのシートの取り外し方を教...
-
原付 レッツシート開け方
-
取れなくなった熱伝導シートの...
-
水の染み込んだバイクのシート...
-
ピルのヤーズの一日分のズレに...
-
エクセルVBA 4行飛ばしで転記す...
-
括弧があるとHYPERLINKで飛べな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
括弧があるとHYPERLINKで飛べな...
-
原付 レッツシート開け方
-
BRIDEのシート張り替えってでき...
-
電車のシートって何でこんな暑...
-
ポケットにミシンでワッペンを...
-
エクセルVBA 4行飛ばしで転記す...
-
車のシートがへたってきました...
-
フォルツァ バッテリーを外して...
-
IHクッキングヒーターの操作パ...
-
Excel複数シートから日付と文字...
-
シートベルトの固定解除
-
中学生です。体育館の床に敷く...
-
リアシート無しで運転してたら...
-
癒着してしまったテレビの液晶...
-
台所流しの水音を小さくしたい
-
マジェスティ(4HC)のシート下...
-
水の染み込んだバイクのシート...
-
Excel VBA シート名変更時、重...
-
Google スプレッドシート:FILT...
おすすめ情報