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