[[20130311101632]] 『特定のシートの削除を禁止』(ころせんせー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『特定のシートの削除を禁止』(ころせんせー)

 Excel2010を使っています

 あるデータブックで、必要なシートを間違えて削除してしまって大変なことになることがあるので
 いくつかの特定のシートの「削除のみ」を禁止したいのですが…

 シートの保護ではなく、「シートの削除のみ」を禁止する方法を検索していくつか方法が
 出てきたもののVBAがよく分かってなくて応用ができません…

http://www.ka-net.org/ribbon/ri67.html
https://www.excel.studio-kazu.jp/kw/20110525153257.html

 この辺りを見ていましたが…

 削除禁止にしたいシートは11シートぐらいありますが、そのうち5シートのシート名の末尾2文字が
 「ひな」という以外はシート名に共通点はありません。
 (ブックには20ぐらいのシートがありますが、上記シート以外は随時削除OKです)

 削除禁止にするのは、手動で削除しようとする場合と、ユーザーフォームのリストボックスに
 シート一覧を表示させていて、そのユーザーフォームの「シート削除」のコマンドボタンを押した時です。

 ↓下記のコードでユーザーフォームにシートの一覧を取得しています

 Private Sub UserForm_Initialize()

 Dim i As Integer

 For i = 1 To Worksheets.Count
  ListBox1.AddItem Worksheets(i).Name
 Next

 End Sub

 ↓ユーザーフォームの「シート削除」ボタンのコード

 Private Sub CommandButton3_Click()

    Dim i As Integer
    Dim j As Integer
    Dim v() As String
    Dim k As Integer

    With ListBox1
        ReDim v(1 To .ListCount)
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                k = k + 1
                v(k) = .List(i)
            End If
        Next i 

    End With

    ReDim Preserve v(1 To k)

    If MsgBox("以下のシートを削除しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then
        Application.DisplayAlerts = False
        Sheets(v).Delete
        Application.DisplayAlerts = True
    End If

         ListBox1.Clear
         Call UserForm_Initialize

 End Sub

 上記コードは前任の人が作ったもので、自分ではよく仕組みを分かっていません…

 OSはWindows7です。

 お知恵をお貸しください 

 自分で作る時間はないので申し訳ないけど、
「特定のシートのみ削除できない」という仕様よりも、
「特定のシートのみ削除できる」という仕様にしたほうが
すっきりするかもしれません。
基本的にブック保護とし、ユーザーフォームで削除してもよいシートのみ
表示して選択させ、有効なシートなら都度ブック保護解除してシート削除、
削除後再度ブック保護という手順でしょうか。
 
ただ、「ひな」とは「雛形のシート」という意味のものだと推測してしおりますが、
もしそうなら、シートテンプレートとして外部に保存しておいて、
必要な時にテンプレートを該当ブックに挿入する、という仕組みにしておくと、
間違えて削除してしまった、と言うことは少なくなるように思えます。
(みやほりん)

 私がレスしたものを参考にしていただいたようで、汗、汗・・・
 今、見直してみると、操作でシートを削除する場合、複数シートを選んでシート削除する場合もあって
 このケースでは、必ずしも、削除対象のシートで Activateイベントが発生しないので、片手落ち。
 やはり、もう1つ参照された削除メニューが要求された時の制御がいいね。
 「エクセルVBA 特定のシート削除の禁止」で検索すると、他にもいろいろヒットすると思う。

 でも、基本的には、この制御、やっかいだよね。エクセルの基本機能で、このようなものがあってもいいと思うけど
 ないものねだりなので・・・

 一方、ユーザーフォームのリストボックスでの選択における制御は簡単。
 このリストがどのように作られているかはわからないけど

 ・そもそも削除させたくないシートは、このリストには含めない。そうするとリストにあるものは削除してOKということになるので
  今のままのコードでいけるはず。
 ・それができないなら、選択後のシートに、削除させたくない特定のシートがあればエラーメッセージを出して
  実行せずに Exit Sub。

 (ぶらっと)

 みやほりん様
 ぶらっと様
 ありがとうございます。

 ユーザーフォームですが、このリストボックスに表示されたシートを移動したり印刷したり、という別の操作もあり、
 「削除してよいシートのみ表示」では困ることがあるのです…

 >「ひな」とは「雛形のシート」という意味のものだと推測してしおりますが、
 確かにその通りですが、この「雛形のシート」をいくつかのユーザーがコピーして使用するようになっており、
 シートテンプレートの使い方が分からないユーザーもいるので(実は私もよく把握していませんが…)ブックの中に置いておきたいです。

 削除させたくないシート、あるいは削除してもよいシートの名前に共通性を持たせて「特定の文字列から始まるシートは削除不可(またOK)」
 とした方がよいでしょうか…

 (ころせんせー)

 >「削除してよいシートのみ表示」では困ることがあるのです
リストの登録はVBAでもできるので
 Private Sub CommandButton3_Click()
の時は「削除してよいシートのみ」をリストにして
その他は全てにすれば良いのでは?
(ROM人)


 Private Sub CommandButton3_Click()

    Dim i As Integer
    Dim j As Integer
    Dim v() As String
    Dim k As Integer
    Dim ngShn As Variant                        '★追加

    ngShn = Array("Sheet1", "Sheet2", "Sheet3") '★追加(削除不可のシート名)

    With ListBox1
        ReDim v(1 To .ListCount)
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                k = k + 1
                '★以下の4行追加
                If IsNumeric(Application.Match(.List(i), ngShn, 0)) Then
                    MsgBox .List(i) & " は削除できません"
                    Exit Sub
                End If
                v(k) = .List(i)
            End If
        Next i

    End With

    ReDim Preserve v(1 To k)

    If MsgBox("以下のシートを削除しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then
        Application.DisplayAlerts = False
        Sheets(v).Delete
        Application.DisplayAlerts = True
    End If

    ListBox1.Clear
    Call UserForm_Initialize

 End Sub

 とか?

 (ぶらっと)

 ぶらっと様

 ありがとうございます。
 ユーザーフォームからは思った通りの動きができました!

 ROM人様
 シート削除のボタンを押すタイミングで一覧を再取得するということでしょうか?
 (事前に「削除してもよいシートを取得」というのは運用上難しいと思うので…)
 すみません、何かよく理解できていなくて…

 (ころせんせー)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.