【问题标题】:"Method or Data Member Not Found" when Dim'ing Worksheet as Worksheet but not Variant将工作表变暗为工作表而不是变体时“找不到方法或数据成员”
【发布时间】:2015-08-06 03:08:34
【问题描述】:

考虑这个简单的例子。在新工作表中创建一个名为 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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    问题在于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
    

    如果你想直接使用 Object 那么你也可以使用这个

    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 可以正常工作?
    • 我可以给你答案,但我希望你自己找到它;)。做这个。在您的Sub Works() 中,将Watch 放在对象ws 上,然后在运行时查看ws 的类型。
    • 您可能想查看THIS,了解如何添加Watch
    • 我正在关注本地窗口,它确实显示了两者之间的差异。所以我可以看到Dim ws As Worksheet 给了我一个Worksheet/Sheet1 typeDim wsObj as Object 给了我一个 Object/Sheet1 类型。但是,当我在 Locals 窗口中同时展开 wswsObj 时,它们都将 CheckBox1 列为属性......所以它必须与将工作表强制为 Worksheet 类型与 @987654338 有关@,但我仍然缺少 Excel 的对象模型的一些东西......
    • Checkbox1 仅显示 Variant/Object/Worksheets/Sheet1(在这种情况下)而不显示 Worksheet。如果你使用intellisense,当你将ws声明为工作表时,你不会得到.Checkbox1选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多