[[20090320201039]] 『シートの削除・移動等の禁止』(やま) ページの最後に飛ぶ

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

 

『シートの削除・移動等の禁止』(やま)
 左端からシート名 "リスト" "送信票" が有ります。この2枚のみ削除・移動及び
 シート名の変更を禁止する方法をご伝授下さい。

 "送信票" の会社名をシートに貼り付けたコンボボックスに、"リスト" のA列のデータ
 で取り込んでいます。コピー用としてマクロで "送信票" の会社名をシート名とした、
 新シートを "送信票" の右隣りに挿入しています。


 ブックの保護を行えば、すべてのシートに対して、
 削除・移動及び シート名の変更が禁止できます。

 この状態で左端から二つのシート以外なら、
 これらの機能を可能にするようにVBAで「削除・移動及び シート名の変更」をシュミレートする
 方法が考えられます。まるっきりシュミレートする仕様だと結構大変です。
 ユーザーに色んなことをさせることを想定すると、
 Excel機能をVBAでシュミレートするのはどれも大変なのですが・・・。

 「現在選択されているシートに対して、 あるボタンがクリックされたら、削除・移動・名前の変更
 等の選択メニューを表示し、選択された項目により、シートに対して処理する」という仕様なら、
 移動に関しては、もう少し仕様を考えなくてはなりませんが、削除と名前の変更なら、この後の処理は、
 ブックの保護解除、選択された項目の処理実行、再度ブック保護 という処理となり、比較的簡単です。

 というようにVBAで行う方法を検討してみてください。

 特定のシート以外は シートタブ選択---右クリックで表示される機能全部可能にする
 という仕様なら、もうちょっとじっくり、仕様検討が必要かもしれませんが・・・。

 ichinose


 ichinose さん

 返事が遅れて申し訳ありません。
 「ブックの保護解除、選択された項目の処理実行、再度ブック保護」でやってみます。
 移動に関しては安易な考えですが、ブックを開く時に左端からシート名 "リスト" ・
 "送信票" に並ぶ様にと、考えています。 

 もっと本格的な方法をご教授頂ければ有難いです。

 (やま)

 
 


 例題コードとして、新規ブックにて試してください。
 新規ブックには、Sheet1からSheet5までを作成してください。

 Thisworkbookのモジュールにブックが開いたら、ブックの保護を行うコードです。

 '===================================================================
 Private Sub Workbook_Open()
    On Error Resume Next
    ThisWorkbook.Protect
    On Error GoTo 0
 End Sub

 ユーザーフォーム(UserForm1)を作成してください。
 コントロールは、説明の都合上コードで配置しますから、
 何も配置しないください。

 Userform1のモジュールに
 '================================================================================
 Option Explicit
 Public shori As Long
 '↑  1 シート削除 2 シート名変更 3 シート移動 9 処理ナシ
 Public reshtnm As String
 '    ↑ shoriが2のとき意味があり、変更シート名
 Public mvidx As Long
 '    ↑ shoriが3のとき意味があり、このシートindexの後に移動する
 Private stidx As Long
 Private WithEvents optshdel As MSForms.OptionButton
 Private WithEvents optshrnm As MSForms.OptionButton
 Private WithEvents optshmv As MSForms.OptionButton
 Private lstshnm As MSForms.ListBox
 Private WithEvents spn_up_dwn As MSForms.SpinButton
 Private lblsht As MSForms.Label
 Private txtsht As MSForms.TextBox
 Private WithEvents btn_ok As MSForms.CommandButton
 Private WithEvents btn_ng As MSForms.CommandButton
 '================================================================================
 Private Sub btn_ng_Click()
    shori = 9
    Me.Hide
 End Sub
 '================================================================================
 Private Sub btn_ok_Click()
    If shori = 2 Then
       reshtnm = txtsht.Text
    ElseIf shori = 3 Then
       If lstshnm.ListIndex - stidx >= 0 Then
          mvidx = lstshnm.ListIndex + 3
       Else
          mvidx = lstshnm.ListIndex + 2
       End If
    End If
    Me.Hide
 End Sub
 '================================================================================
 Private Sub optshdel_Click()
    lblsht.Visible = False
    txtsht.Visible = False
    lstshnm.Visible = False
    spn_up_dwn.Visible = False
    shori = 1
 End Sub
 '================================================================================
 Private Sub optshmv_Click()
    lblsht.Visible = True
    txtsht.Visible = False
    lstshnm.Visible = True
    spn_up_dwn.Visible = True
    shori = 3
 End Sub
 '================================================================================
 Private Sub optshrnm_Click()
    lblsht.Visible = True
    txtsht.Visible = True
    lstshnm.Visible = False
    spn_up_dwn.Visible = False
    shori = 2
 End Sub
 '================================================================================
 Private Sub spn_up_dwn_SpinDown()
    Dim g0 As Long
    With lstshnm
       If .ListIndex < .ListCount - 1 Then
          g0 = .ListIndex + 2
          .AddItem .Value, g0
          .RemoveItem .ListIndex
          .ListIndex = g0 - 1
       End If
    End With
 End Sub
 '================================================================================
 Private Sub spn_up_dwn_SpinUp()
    Dim g0 As Long
    With lstshnm
       If .ListIndex > 0 Then
          g0 = .ListIndex - 1
          .AddItem .Value, g0
          .RemoveItem .ListIndex
          .ListIndex = g0
       End If
    End With
 End Sub
 '================================================================================
 Private Sub UserForm_Activate()
    If shori = 9 Then Me.Hide
 End Sub
 '================================================================================
 Private Sub UserForm_Initialize()
    Dim g0 As Long
    shori = 0
    If ActiveSheet.Index > 2 Then
       With Me
          .Caption = "シートの削除・名前の変更・移動"
          .Width = 417
          .Height = 309
          With .Controls.Add("Forms.Frame.1", , True)
             .TabStop = False
             .Caption = "処理の選択"
             .Left = 18
             .Top = 18
             .Width = 120
             .Height = 108
             .SpecialEffect = 2
             Set optshdel = .Controls.Add("Forms.OptionButton.1", , True)
             With optshdel
                .Left = 24
                .Top = 18
                .Width = 77.5
                .Height = 24
                .Caption = "シートの削除"
             End With
             Set optshrnm = .Controls.Add("Forms.OptionButton.1", , True)
             With optshrnm
                .Left = 24
                .Top = 42
                .Width = 77.5
                .Height = 24
                .Caption = "シート名の変更"
             End With
             Set optshmv = .Controls.Add("Forms.OptionButton.1", , True)
             With optshmv
                .Left = 24
                .Top = 66
                .Width = 77.5
                .Height = 24
                .Caption = "シートの移動"
             End With
          End With
          Set lblsht = .Controls.Add("Forms.Label.1", , False)
          With lblsht
             .Font.Size = 14
             .Left = 150
             .Top = 24
             .Width = 60
             .Height = 18
             .BackColor = &HFFFFC0
             .Caption = "シート名"
             .SpecialEffect = 2
          End With
          Set txtsht = .Controls.Add("Forms.TextBox.1", , False)
          With txtsht
             .TabStop = False
             .Font.Size = 14
             .Left = 210
             .Top = 24
             .Width = 168
             .Height = 18
             .Font.Size = 12
          End With
          Set lstshnm = .Controls.Add("Forms.ListBox.1", , False)
          With lstshnm
             .TabStop = False
             .Left = 150
             .Top = 54
             .Width = 228
             .Height = 192
             For g0 = 3 To ThisWorkbook.Worksheets.Count
                .AddItem ThisWorkbook.Worksheets(g0).Name
             Next
             .ListIndex = ActiveSheet.Index - 3
             stidx = .ListIndex
             .Enabled = False
          End With
          Set spn_up_dwn = .Controls.Add("Forms.SpinButton.1", , False)
          With spn_up_dwn
             .TabStop = False
             .Left = 378
             .Top = 54
             .Width = 24
             .Height = 192
          End With
          Set btn_ok = .Controls.Add("Forms.CommandButton.1", , True)
          With btn_ok
             .TabStop = False
             .Left = 18
             .Top = 132
             .Width = 54
             .Height = 30
             .Caption = "実行"
          End With
          Set btn_ng = .Controls.Add("Forms.CommandButton.1", , True)
          With btn_ng
             .TabStop = False
             .Left = 78
             .Top = 132
             .Width = 54
             .Height = 30
             .Caption = "キャンセル"
          End With
       End With
    Else
       MsgBox "このシートの削除や移動は、禁止されています"
       shori = 9
    End If
 End Sub
 '================================================================================
 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
       Cancel = True
       shori = 9
       Me.Hide
    End If
 End Sub
 '================================================================================
 Sub term_proc()
    Set optshdel = Nothing
    Set optshrnm = Nothing
    Set optshmv = Nothing
    Set lstshnm = Nothing
    Set spn_up_dwn = Nothing
    Set lblsht = Nothing
    Set txtsht = Nothing
    Set btn_ok = Nothing
    Set btn_ng = Nothing
 End Sub

 尚、UserForm_Initialize()のコード内でコントロールを配置していますが、実際には
 殆どのことが事前設定で可能なことです。

 標準モジュールに

 '==========================================================================
 Option Explicit
 Sub Sht_proc()
    With UserForm1
       .Show
       On Error Resume Next
       Select Case .shori
         Case 1
           ThisWorkbook.Unprotect
           ActiveSheet.Delete
           ThisWorkbook.Protect
         Case 2
           ThisWorkbook.Unprotect
           ActiveSheet.Name = .reshtnm
           ThisWorkbook.Protect
         Case 3
           ThisWorkbook.Unprotect
           ActiveSheet.Move After:=Worksheets(.mvidx)
           ThisWorkbook.Protect
        End Select
       .term_proc
    End With
    Unload UserForm1
 End Sub

 これで 一度適当な場所に保存した後、一度当該ブックを閉じた後、再び、当該ブックを開いてください

 Sheet1、Sheet2以外のシートをアクティブにして上記のSht_proc を実行してください。

 ユーザーフォームが表示されます。
 削除 名前の変更、移動という処理が選択できますから、選択して下さい。

 削除を選択したら、そのまま実行ボタンを押してください、アクティブシートが削除されます。

 名前の変更を選択すると、変更名が入力できますから、入力後、実行ボタンを押してください。
 名前の変更を行います。

 移動を選択すると、リストボックスにアクティブシートの現在の位置が表示されますから、スピンボタンで
 移動先を調節してください。移動先が確定したら、実行ボタンを押してください。指定位置に移動します。

 一例ですが、試してみてください。うまくいくようでしたら、適当なボタンにSht_procを登録すればよいです。

 ichinose@2009/3/23朝訂正
 


 ichinose さん

 ご返答頂いてるのを今まで全く気づかず、大変申し訳ありません。
 今、エクセルにコードを貼り付け実行しました。
 自分が思っていた以上の事が出来感激しています。
 コードの意味するところを、これから勉強させて頂きます。

 有難うございました。

 (やま)


コメント返信:

[ 一覧(最新更新順) ]


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