如果激活图表
,以下代码将让用户返回到旧工作表,并显示返回之前图表
中包含多少个数据点。我想知道为什么在两个事件处理程序中变量 Sh
被定义为 Object
而不是 Sheet
。对于变量 OldSheet
也是如此。
Dim OldSheet As Object
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Set OldSheet = Sh
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Msg As String
If TypeName(Sh) = "Chart" Then
Msg = "This chart contains "
Msg = Msg & ActiveChart.SeriesCollection(1).Points.Count
Msg = Msg & " data points." & vbNewLine
Msg = Msg & "Click OK to return to " & OldSheet.Name
MsgBox Msg
OldSheet.Activate
End If
End Sub
最佳答案
因为 Excel 中没有“工作表”这样的东西。
请注意,事件是 SheetActivate
,而不是 WorksheetActivate
- “工作表”的概念包含多种类型,除了“激活”的能力之外,这些类型没有任何共同点”。 Excel 对象模型中没有 Sheet
类型 - Workbook.Sheets
集合包含各种类型的对象,包括 Chart
和 Worksheet
对象。
SheetActivate
事件中的 Sh
参数必须是一个Object
,因为没有通用接口(interface)图表
和工作表
之间。
因此,您需要执行您所做的操作:验证对象的类型,而不是假设您正在处理 Chart
或 Worksheet
对象。
您应该使用 TypeOf
运算符,而不是使用 TypeName
函数和字符串类型检查:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If TypeOf Sh Is Excel.Worksheet Then
Debug.Print "Worksheet!"
ElseIf TypeOf Sh Is Excel.Chart Then
Debug.Print "Chart!"
Else
Debug.Print "Something else!"
End If
End Sub
作为Object
的参数允许 future 的版本激活一个在事件声明被写入事件声明时无法想象的类型的“表”。 IWorkbookEvents
每个 Workbook
对象实现的隐藏接口(interface)。
关于vba - 为什么在下面的VBA代码中使用Object类型而不是Sheet类型来声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442302/