我正在写一个excel插件。 我想在我的代码中有一个功能,当我右键单击我的Activeworkbook中的工作表选项卡并单击删除..我可以弹出一个自定义消息并捕获对话框的返回值,并基于YES或NO,我可以决定是否继续删除表格?请帮助。
答案 0 :(得分:1)
不幸的是,没有特定的事件可以处理Sheet Deletion事件。说过我可以想到三个选项,但这三个选项都有自己的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
HERE是安迪波普建议的另一种方法。
缺点如该链接所述,多工作簿会变得更复杂。