如何解决VBA代码删除最后激活工作表(含图表工作表)时的类型不匹配错误?
解决删除图表工作表后VBA运行时错误'13':类型不匹配的问题
问题原因
你声明的LstSht是Worksheet类型,但通过Win+F11创建的图表工作表属于Chart对象,不属于Worksheet范畴。当切换离开图表工作表时,Workbook_SheetDeactivate事件会把Chart对象赋值给Worksheet类型的变量,触发类型不匹配;删除图表工作表后,调用GoToLast时,变量指向已失效的Chart对象,错误彻底爆发。
修复步骤
修改公共变量类型
把模块中的Public LstSht As Worksheet改为:Public LstSht As ObjectObject类型可以兼容Worksheet和Chart两种对象,从根源避免类型不匹配问题。增加对象有效性判断
在GoToLast过程中添加判断逻辑,确保调用Activate时目标对象仍存在于工作簿中:Sub GoToLast() If Not LstSht Is Nothing Then Dim obj As Object Dim isExists As Boolean isExists = False ' 遍历所有工作表和图表,确认目标对象未被删除 For Each obj In ThisWorkbook.Sheets If obj Is LstSht Then isExists = True Exit For End If Next obj If isExists Then LstSht.Activate Else MsgBox "目标工作表/图表已被删除" End If Else MsgBox "没有可返回的工作表/图表" End If End Sub(可选)优化SheetDeactivate事件
可以在事件中增加类型过滤,只记录工作表或图表对象:Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) If TypeName(Sh) = "Worksheet" Or TypeName(Sh) = "Chart" Then Set LstSht = Sh End If End Sub
内容的提问来源于stack exchange,提问作者Jan V
相关产品推荐
相关产品推荐

