我正在写一个excel插件。我想在我的代码中有一个功能,这样当我右键单击Active工作簿中的工作表选项卡并单击删除时。。我可以弹出一条自定义消息并捕获对话框的返回值,根据是或否,我可以决定是否应该继续删除工作表?请帮忙。
遗憾的是,没有处理"图纸删除"事件的特定事件。话虽如此,我可以想到三种选择,但三种都有自己的cons
选项1
此方法涉及保护工作簿结构。这将禁止用户删除任何工作表。如果他们想删除图纸,必须通过外接程序中的选项进行删除。也许是一个按钮?
缺点:保护每个工作簿的结构不实用。但是如果你想要一个特定工作簿的功能,那么这是最好的方法
选项2
此方法包括创建temp
工作表并将其隐藏在活动工作簿中。临时工作表在工作簿打开时创建,在工作簿关闭时删除。每次激活工作表时,活动工作表中的数据都会复制到临时工作表中,这样,如果用户删除了不需要的工作表,您就可以随时恢复它。我们之所以采取这种方法,是因为UnDo
无法恢复已删除的工作表。
此外,当添加或删除图纸时,某些图纸也会被激活。因此,我们将使用Workbook_SheetActivate
事件,以便检查工作表计数,并得出是否删除或添加了工作表的结论。
下面是我编写的示例代码,用于演示它的工作原理。你可以简单地增强它以满足你的需求。
Const wsTempName As String = "MyAddinTempSheet"
Dim wsTemp As Worksheet
Dim TempSheetCount As Long
Dim boolFirst As Boolean
Private Sub Workbook_Open()
boolFirst = True
Set wsTemp = ThisWorkbook.Sheets.Add
wsTemp.Name = wsTempName
wsTemp.Visible = xlSheetHidden
ThisWorkbook.ActiveSheet.Cells.Copy wsTemp.Cells
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets(wsTempName).Delete
Application.DisplayAlerts = True
On Error GoTo 0
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim wsCount As Long
If boolFirst = True Then
TempSheetCount = ThisWorkbook.Sheets.Count
boolFirst = False
Else
wsCount = ThisWorkbook.Sheets.Count
If wsCount < TempSheetCount Then
MsgBox "Sheet(s) was/were deleted"
ElseIf wsCount > TempSheetCount Then
MsgBox "Sheet(s) was/were Added"
End If
End If
End Sub
缺点:如果工作表有很多数据,那么创建工作表备份可能是一件令人讨厌的事情。
选项3
这是Andy Pope提出的另一种方法。
缺点如该链接所述,使用多工作簿会变得更加复杂。