为什么在以下VBA代码中使用Object类型而不是Sheet类型用于变量声明?

Nic*_*las 4 excel vba excel-vba

如果a Chart已激活,则以下代码将用户返回到旧工作表,并显示Chart返回之前包含的数据点数.我想知道为什么变量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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

因为在Excel中没有"Sheet"这样的东西.

注意事件是SheetActivate,不是WorksheetActivate- "表"的概念包含几个没有任何共同点的类型,除了"激活"的能力.有没有Sheet在Excel对象模型类型-该Workbook.Sheets集合包含不同类型的对象,其中包括 ChartWorksheet对象.

Sh在参数SheetActivate事件具有是一个Object,因为有一个之间没有共同的接口Chart和一个Worksheet.

所以你需要做你做的事情:验证对象的类型,而不是假设你正在处理一个Chart或一个Worksheet对象.

TypeName您应该使用TypeOf运算符来代替使用函数并因此使用字符串类型检查:

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
Run Code Online (Sandbox Code Playgroud)

该参数Object允许将来的版本激活IWorkbookEvents每个Workbook对象实现的隐藏接口中编写事件声明时无法想到的类型的"工作表" .

  • FWIW,`TypeOf`也*更快.;-) (2认同)