excel 在VBA中,是否可以获取存储为变量的工作表上的按钮的值?

fykwrbwg  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(183)

在VBA中,是否有一种方法可以引用作为变量保存的工作表上的按钮?除非我直接引用工作表,否则它似乎会抛出一个“未找到方法或数据成员”的编译错误。例如:

Sub Test_Parent
    Call Test_Child(Temp_WS:=Sheet1)
End Sub

Sub Test_Child(ByVal Temp_WS as Worksheet)
    debug.print Temp_WS.Example_Button.Value
End Sub

字符串
上面的代码会在debug.print行上触发错误。鉴于以下各项正常工作:

Sub Test2
    debug.print Sheet1.Example_Button.Value
End Sub


我的直觉告诉我,这是因为在第二种情况下,编译器会查看直接引用(例如:Sheet1),并可以看到按钮作为成员存在,而在第一种情况下,它会查看变量并将其视为通用工作表类型(而不是Sheet1),因此不认为会有此成员?或者我完全搞错了?
不管怎样,有办法解决吗?(我是不是在做一些愚蠢的事情?)如果不是,那也不是世界末日,但我通常喜欢最小化硬编码的工作表引用的数量,所以如果这是一种解决它的方法,那就太好了。

nxagd54h

nxagd54h1#

Example_Button,作为ActiveXOLEObjectSheet1的成员,可以引用为Sheet1.Example_Button
但它也是OLEObjectshape
您无法将其作为常规Worksheet对象的成员找到。您可以尝试使用Sub,通常声明参数As Variant(或As Object),传递Sheet1类本身:

Sub Test_Child(ByVal Temp_WS as Variant)
    Debug.Print Temp_WS.Example_Button.Value
End Sub

字符串
这个会有用的实际上,声明As VariantAs Object会模拟下一个Sub,这允许将参数声明为所涉及的工作表类。唯一一个以您尝试的方式暴露对象的方法:

Sub Test_ChildSheetSh1(ByVal Temp_WS As Sheet1)
    Debug.Print Temp_WS.Example_Button.Value
End Sub


但更好的方法是将对象用作OLEObjectshape,这也适用于Worksheet对象:

Sub Test_ChildOLE(ByVal Temp_WS as Worksheet)
    Debug.Print Temp_WS.OLEObjects("Example_Button").Object.Value
End Sub


或者是

Sub Test_ChildSh(ByVal Temp_WS As Worksheet)
    Debug.Print Temp_WS.Shapes("Example_Button").OLEFormat.Object.Object.Value
End Sub


您可以通过以下方式将Worksheet事件用于Form类型的按钮(而不是ActiveX):

Sub Test_ChildForm(ByVal Temp_WS As Worksheet)
    Debug.Print Temp_WS.Shapes("Example_Button").OLEFormat.Object.Caption
End Sub

相关问题