保护工作簿结构将阻止用户删除工作表。但是我怎么能(使用VBA)阻止用户删除我指定的特定表单?我已经看过
阻止活动工作表被删除的例子Set mymenubar = CommandBars.ActiveMenuBar
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False
在Worksheet_Activate
事件中,但当然只有在激活工作表时才有效
有没有办法阻止工作表被删除是否有效?
为清楚起见:我很好,用户删除了一些纸张,而不是几张特定的纸张
因此,保护工作簿结构不会起作用。
答案 0 :(得分:6)
据我所知,不可能将单张纸本地标记为不可删除;并且没有可用于检测何时将要删除工作表的事件,因此可以预防性地保护工作簿。
但是,这是一个潜在的解决方法:
当然,用户必须习惯这种删除工作表的方式(而不是在工作表的选项卡上右键单击>删除)。不过,这并不复杂。
至于如何实现#2,即维护工作表名称列表,我想你可以使用像这样的UDF(必须作为数组公式调用):
Function DeletableSheetNames() As String()
Application.Volatile
Dim i As Long
Dim sn() As String
With ThisWorkbook
ReDim sn(1 To .Sheets.Count)
For i = 1 To .Sheets.Count
With .Sheets(i)
If .Name = "DataEntry1" Or .Name = "DataEntry2" Then
'Don't include it in the list.
Else
sn(i) = .Name
End If
End With
Next i
End With
DeletableSheetNames = sn
End Function
答案 1 :(得分:3)
您无法阻止用户删除特定工作表,但您可以使用Workbook_BeforeSave()
事件来防止在缺少特定工作表时保存工作簿。此事件的文档精确地说明了如何仅在满足某些条件时才允许保存工作簿。见http://msdn.microsoft.com/en-us/library/office/ff840057(v=office.14).aspx
答案 2 :(得分:3)
我可以阻止通过Worksheet_BeforeDelete事件删除工作表,如下所示:
Private Sub Worksheet_BeforeDelete()
Call ThisWorkbook.Protect("password")
Call MsgBox("This sheet cannot be deleted.", vbExclamation)
End Sub
这可以保护所有工作表不被删除,但是如果您在ThisWorkbook模块上添加一些事件代码,如下所示:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call ThisWorkbook.Unprotect("password")
End Sub
我可以在选择后立即删除任何其他工作表。
请记住,当页面解锁时,您将失去页面之间的复制和粘贴功能。
答案 3 :(得分:1)
我在ExtendOffice.com上找到了类似于Dan的解决方案。将此代码放在工作表的模块中:
Private Sub Worksheet_Activate()
ThisWorkbook.Protect "yourpassword"
End Sub
Private Sub Worksheet_Deactivate()
ThisWorkbook.Unprotect "yourpassword"
End Sub
当您激活相关工作表时,整个工作簿受到保护,并且"删除"选项显示为灰色。当您切换到任何其他工作表时,工作簿再次空闲。它很微妙,因为当你去'" safe"时,你只会注意到这种变化。片材。
答案 4 :(得分:1)
"没有可用于检测工作表何时被删除的事件"
自Office 2013起,可以使用 SheetBeforeDelete 事件。
答案 5 :(得分:0)
答案是将以下代码添加到每个受保护的工作表中:
for i in x:
然后将以下内容添加到模块:
curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
相应地检查https://www.top-password.com/blog/prevent-excel-sheet-from-being-deleted/的信用。
答案 6 :(得分:0)
也许您可以尝试在 SheetBeforeDelete 中保护工作簿的结构。 看我的例子:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
ThisWorkbook.Protect Structure:=False
End Sub
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
If Sh.Name = "Example" Then
ThisWorkbook.Protect Structure:=True
End If
End Sub