删除图纸/图表事件VBA

我试图触发一个macros(Excel)被删除时的macros。 自2010年以来,有不同的删除事件:

应用程序级别:Application.SheetBeforeDelete事件。

工作簿级别:Workbook.SheetBeforeDelete事件。

工作表级别:Worksheet.BeforeDelete事件。

作为一个初学者,我不能申请最后两个,但是我尝试申请第一个。

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) Call Macro End Sub 

这可以在工作表上正常工作,但对图表(仅包含图表的工作表)无效。

我的目标是调整我的计数器,并可能重命名工作表,因为我的工作表被命名为Sheetname(1),..(2)..并且用户经常删除工作表。

我搜查了很多,但我找不到任何可以遵循的例子。

任何帮助将非常感激。

这看起来像一个实施监督,这个事件应该根据devise实施。 实际上, Sheets集合是WorksheetsCharts集合的结合。 由于事件的名称是Workbook_SheetBeforeDelete (而不是Workbook_WorksheetBeforeDelete ),所以常识意味着事件应该适用于所有Sheets ,即WorksheetsCharts

请注意,对于图表和工作表,会引发其他事件,例如Workbook_SheetDeactivate 。 这确认了错误,但也提出了一个利用Workbook_SheetDeactivate事件的解决方法。

我们可以在ThisWorkbook代码模块中添加两个程序。 checkChartDelete()检查图表是否已被删除并启动相应的操作。 它需要通过Application.OnTime来调用,所以它通过一个静态variableschartNameToCheck来获取它的参数。

 ' Code Module ThisWorkbook Option Explicit Private chartNameToCheck As String Private Sub checkChartDelete() On Error Resume Next Dim x: Set x = Sheets(chartNameToCheck) If Err.Number <> 0 Then '********************************************** ' call or do here the action on chart deleted ' '********************************************** MsgBox "chart deleted: " & chartNameToCheck End If chartNameToCheck = "" End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) If TypeName(Sh) <> "Chart" Then Exit Sub chartNameToCheck = Sh.name Application.OnTime Now, "ThisWorkbook.checkChartDelete" End Sub