Question: Protecting workbook structure will prevent a user from deleting sheets. But how could I (using VBA) prevent a user from deleting a *particular* sheet I designate? I've seen examples where an active sheet is prevented from deletion by

```
Set mymenubar = CommandBars.ActiveMenuBar
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False

```

in its `Worksheet_Activate` event but that of course only works if the sheet is activated.  

Is there a way to prevent a sheet from being deleted whether active or no?  

For clarity: I'm fine with the user deleting some sheets, just not a couple of particular sheets.  

So protecting workbook structure won't work.

Answer: 
You cannot stop users to delete a particular sheet but you could use the `Workbook_BeforeSave()` event to prevent the workbook from being saved if a particular sheet is missing. The documentation on this event precisely shows how to allow saving a workbook only when certain conditions are met. See [http://msdn.microsoft.com/en-us/library/office/ff840057(v=office.14).aspx](http://msdn.microsoft.com/en-us/library/office/ff840057%28v=office.14%29.aspx)
Here is another answer from mine base on the idea of @Jean-François Corbett
You can use 'Protect WB Structure' and Event 'Workbook\_SheetBeforeDelete' to achieve this.
The result is that an dialog will pop up said "Workbook is protected and cannot be changed."

```
Private Sub zPreventWShDel(WSh As Worksheet, Protection As Boolean)
Dim zPassword As String: zPassword = ""
Dim zWB As Workbook
Set zWB = WSh.Parent
If Protection Then
    zWB.Protect zPassword, Protection
Else
    zWB.Protect zPassword, Protection
End If

'Stop
End Sub

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
Call zPreventWShDel(Sh, True)
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call zPreventWShDel(Sh, False)
End Sub

```

Do not Call the code on Sheet Deactivation like below. Because it will deactivate it. Sequence of running is Event\_SheetBeforeDelete -> Event\_SheetDeactivate.

```
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Call zPreventWShDel(Sh, False)
End Sub

```