在Excel中提示删除工作表

时间:2013-11-20 09:12:47

标签: c# excel-vba vsto excel-2007 vba

我正在写一个excel插件。 我想在我的代码中有一个功能,当我右键单击我的Activeworkbook中的工作表选项卡并单击删除..我可以弹出一个自定义消息并捕获对话框的返回值,并基于YES或NO,我可以决定是否继续删除表格?请帮助。

1 个答案:

答案 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是安迪波普建议的另一种方法。

缺点如该链接所述,多工作簿会变得更复杂。