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事件中,但当然只有在工作表被激活时才有效.
有没有办法阻止工作表被删除是否有效?
为清楚起见:我很好,用户删除了一些床单,而不是几张特定的床单.
因此,保护工作簿结构将无法正常工作.
据我所知,不可能将单张纸本地标记为不可删除; 并且没有可用于检测何时将要删除工作表的事件,因此可以预防性地保护工作簿.
但是,这是一个潜在的解决方法:
当然,用户必须习惯这种删除工作表的方式(而不是在工作表的选项卡上右键单击>删除).不过,这并不复杂.
至于如何实现#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)
然后,一旦选择任何其他工作表,我就可以将其删除。
请记住,由于选择页面时解锁,您将失去页面之间的复制和粘贴功能。