删除图纸/图表事件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
集合是Worksheets
和Charts
集合的结合。 由于事件的名称是Workbook_SheetBeforeDelete
(而不是Workbook_WorksheetBeforeDelete
),所以常识意味着事件应该适用于所有Sheets
,即Worksheets
和Charts
。
请注意,对于图表和工作表,会引发其他事件,例如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