当将Worksheet声明为Worksheet而不是Variant时,出现“找不到方法或数据成员”的错误。

3
考虑这个简单的例子。在一个新的工作表中创建一个名为Checkbox1的ActiveX复选框。
尝试以下两个子程序。第一个会出现“找不到方法或数据成员”错误,而第二个可以正常运行。
为什么第一个示例不能运行?
Option Explicit

Sub DoesntWork()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox "Checkbox state is: " + CStr(ws.CheckBox1.Value)

End Sub

Sub Works()
Dim ws As Variant
Set ws = Worksheets(1)

MsgBox "Checkbox state is: " + CStr(ws.CheckBox1.Value)

End Sub
1个回答

4
问题出在 ws.CheckBox1.Value 这一行。你不能像这样使用它,因此会出现错误。尝试这样做:
Sub Sample()
    Dim ws As Worksheet
    Dim objole As OLEObject

    Set ws = Worksheets(1)

    Set objole = ws.OLEObjects("CheckBox1")

    MsgBox "Checkbox state is: " & objole.Object.Value
End Sub

如果您想直接使用对象,则也可以使用此方法。
Sub Sample()
    Dim ws As Worksheet

    Set ws = Worksheets(1)

    MsgBox "Checkbox state is: " & Worksheets(ws.Name).CheckBox1.Value
End Sub

很奇怪。为什么我不能通过ws.Checkbox1访问它,但是通过Worksheets(ws.Name).Checkbox1却可以正常工作? - pedram
我可以给你答案,但是我希望你自己找到它 ;). 在你的Sub Works()中,对对象ws打一个观察点(Watch),然后查看ws在运行时的类型。 - Siddharth Rout
1
你可能想看一下这个链接,了解如何添加“监视”。 - Siddharth Rout
我在关注本地窗口,它显示了两者之间的差异。所以我可以看到 Dim ws As Worksheet 给了我一个 Worksheet/Sheet1 类型。而 Dim wsObj as Object 给了我一个 Object/Sheet1 类型。但是当我在本地窗口中展开 wswsObj 时,它们都列出 CheckBox1 作为属性...所以这一定与将工作表强制转换为 Worksheet 类型相比较 Object 有关,但我仍然在使用Excel的对象模型方面遗漏了某些内容... - pedram
1
Checkbox1 只适用于 Variant/Object/Worksheets/Sheet1(在这种情况下),而不适用于 Worksheet。如果您使用智能感知,当您将 ws 声明为工作表时,您将无法获得 .Checkbox1 选项。 - Siddharth Rout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接