阻止用户删除特定工作表

时间:2014-05-14 04:55:21

标签: vba excel-vba excel

保护工作簿结构将阻止用户删除工作表。但是我怎么能(使用VBA)阻止用户删除我指定的特定表单?我已经看过

阻止活动工作表被删除的例子
Set mymenubar = CommandBars.ActiveMenuBar
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False

Worksheet_Activate事件中,但当然只有在激活工作表时才有效 有没有办法阻止工作表被删除是否有效?
为清楚起见:我很好,用户删除了一些纸张,而不是几张特定的纸张 因此,保护​​工作簿结构不会起作用。

7 个答案:

答案 0 :(得分:6)

据我所知,不可能将单张纸本地标记为不可删除;并且没有可用于检测何时将要删除工作表的事件,因此可以预防性地保护工作簿。

但是,这是一个潜在的解决方法:

  1. 保护工作簿结构:如您所示,这将阻止删除所有工作表。
  2. 创建“控件”表。在此工作表上,维护所有工作表名称的列表(您不希望删除的工作表名称除外)。
  3. 如果用户想要删除工作表,则必须在“控制”工作表上选择其名称(例如,在数据验证下拉菜单中),然后按“删除”按钮。此按钮将调用暂时取消保护工作簿的宏,删除选定的工作表,然后重新保护工作簿。
  4. 当然,用户必须习惯这种删除工作表的方式(而不是在工作表的选项卡上右键单击>删除)。不过,这并不复杂。

    至于如何实现#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