vba - 为什么在下面的VBA代码中使用Object类型而不是Sheet类型来声明变量?

标签 vba excel

如果激活图表,以下代码将让用户返回到旧工作表,并显示返回之前图表中包含多少个数据点。我想知道为什么在两个事件处理程序中变量 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 集合包含各种类型的对象,包括 ChartWorksheet 对象。

SheetActivate 事件中的 Sh 参数必须是一个Object,因为没有通用接口(interface)图表工作表之间。

因此,您需要执行您所做的操作:验证对象的类型,而不是假设您正在处理 ChartWorksheet 对象。

您应该使用 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/

相关文章:

vba - 根据每日价格时间序列计算每周 yield

python - 文本文件中没有附加任何文本

excel - 错误时->取消已完成的操作

excel - 如何在Excel VBA监 window 口中监视字典中的值?

excel - 如何删除超过一个月的工作表?

excel - 如何改进这个类模块定义

arrays - Excel VBA(不是 VBScript)101 : How do I create and read a multidimensional array?

excel - 显示依赖于变量的备用用户窗体

excel - 条件格式 : making cells colorful

excel - 从相乘值中识别最小值