カスタム検索
リボン関連

特定のワークシートの削除と名前変更を禁止する(Excel)

Excel 2003までは下記のようなコードで、CommandBarButtonをクリックしたときのイベントを利用してワークシートの削除や名前の変更といった操作を禁止することが出来ていました。

 

[ThisWorkbook]

Option Explicit

Private WithEvents DelBtn As Office.CommandBarButton
Private WithEvents RenBtn As Office.CommandBarButton

Private Const SheetName As String = "Sheet1" '削除・リネームを禁止するシート名

Private Sub Workbook_Open()
  SetBtn
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  UnSetBtn
End Sub

Public Sub SetBtn()
  Set DelBtn = Application.CommandBars.FindControl(ID:=847) '削除(&D)
  Set RenBtn = Application.CommandBars.FindControl(ID:=889) '名前の変更(&R)
End Sub

Public Sub UnSetBtn()
  Set DelBtn = Nothing
  Set RenBtn = Nothing
End Sub

Private Sub DelBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  If ActiveSheet.Name = SheetName Then
    MsgBox "このシートを削除することはできません。", vbCritical
    CancelDefault = True
  End If
End Sub

Private Sub RenBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  If ActiveSheet.Name = SheetName Then
    MsgBox "このシートの名前を変更することはできません。", vbCritical
    CancelDefault = True
  End If
End Sub

しかし、Excel 2007以降インターフェースがリボンになってからはリボン上(ホームタブのセルグループ)からも削除や名前の変更ができるようになったため、上記のコードだけでは対応できなくなりました。
そこで今回は「特定の機能を利用禁止にする」を応用した2007以降専用のコードを下記にて紹介します。

 

※ リボンXMLの編集方法については「Office 2010対応Custom UI Editor Tool のインストール・使用方法」「Office Ribbon Editorの紹介」「SharpDevelopでリボンXMLを編集する」等のページを参照してください。

 

[ThisWorkbook]

'※ getEnabled属性のコールバックによってコントロールの有効・無効を切り替え

Option Explicit

Private myRibbon As Office.IRibbonUI
Private flg As Boolean

Private Const SheetName As String = "Sheet1" '削除・リネームを禁止するシート名

Public Sub Ribbon_onLoad(ribbon As IRibbonUI)
  Set myRibbon = ribbon
  
  '初期値設定
  If ActiveSheet.Name = SheetName Then
    flg = False
  Else
    flg = True
  End If
End Sub

Public Sub command_getEnabled(control As IRibbonControl, ByRef returnedVal)
  returnedVal = flg
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  'アクティブシートによってコントロールの有効・無効切替
  If Sh.Name = SheetName Then
    flg = False
  Else
    flg = True
  End If
  myRibbon.Invalidate 'リボン再表示
End Sub

[リボンXML]

<?xml version="1.0" encoding="utf-8"?>
<customUI onLoad="ThisWorkbook.Ribbon_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <commands>
    <command idMso="SheetDelete" getEnabled="ThisWorkbook.command_getEnabled" />
    <command idMso="SheetRename" getEnabled="ThisWorkbook.command_getEnabled" />
  </commands>
</customUI>

 

Sponsored Links

 

上記コードによって"Sheet1"を選択しているときだけ"シートの削除"と"シート名の変更"が無効になります。
ただし、上記のコードは完全に操作を禁止するものではありません。例えば他のブックからマクロでワークシートを削除することは可能ですし、"シート見出し"をダブルクリックすることでシート名の変更も出来てしまいます。そもそもマクロを有効にしていなければ機能しませんので、保護するという点ではシートの保護をした方が余程有効です。
上記の処理はあくまでも簡易的な制御、という認識でご使用ください。