阻止用户删除特定工作表

use*_*688 7 excel vba excel-vba

保护工作簿结构将阻止用户删除工作表.但是我怎么能(使用VBA)阻止用户删除我指定的特定表单?我见过一些示例,其中有效的工作表被阻止删除

Set mymenubar = CommandBars.ActiveMenuBar
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False
Run Code Online (Sandbox Code Playgroud)

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

Jea*_*ett 6

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

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

  1. 保护工作簿结构:如您所示,这将阻止删除所有工作表.
  2. 创建"控件"表.在此工作表上,维护所有工作表名称的列表(除了那些您不希望删除的工作表名称).
  3. 如果用户想要删除工作表,则必须在"控制"工作表上选择其名称(例如,在数据验证下拉菜单中),然后按"删除"按钮.此按钮将调用暂时取消保护工作簿的宏,删除选定的工作表,然后重新保护工作簿.

当然,用户必须习惯这种删除工作表的方式(而不是在工作表的选项卡上右键单击>删除).不过,这并不复杂.

至于如何实现#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
Run Code Online (Sandbox Code Playgroud)


小智 5

我可以通过 Worksheet_BeforeDelete 事件防止删除工作表,如下所示:

Private Sub Worksheet_BeforeDelete()

    Call ThisWorkbook.Protect("password")

    Call MsgBox("This sheet cannot be deleted.", vbExclamation)

End Sub
Run Code Online (Sandbox Code Playgroud)

这可以保护所有工作表不被删除,但是如果您在 ThisWorkbook 模块上添加一些事件代码,如下所示:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Call ThisWorkbook.Unprotect("password")

End Sub
Run Code Online (Sandbox Code Playgroud)

然后,一旦选择任何其他工作表,我就可以将其删除。

请记住,由于选择页面时解锁,您将失去页面之间的复制和粘贴功能。