在 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),所以认为不会有这个成员?或者也许我完全偏离了目标?
无论哪种方式,有办法解决吗? (或者我是否为此做了一些愚蠢的事情?)如果不是,那不是世界末日,但我通常喜欢最大限度地减少对工作表的硬编码引用的数量,所以如果这是解决它的方法,那么那就是太棒了。
Example_Button
,作为 ActiveX
OLEObject
是 Sheet1
的成员,可以引用为 Sheet1.Example_Button
。
但它也是一个
OLEObject
和一个shape
。
您无法将其视为一般
Worksheet
对象的成员。您可以尝试使用 Sub
,通常声明参数 As Variant
(或 As Object
),传递 Sheet1
类本身:
Sub Test_Child(ByVal Temp_WS as Variant)
Debug.Print Temp_WS.Example_Button.Value
End Sub
这会起作用。
但更好的方法是将对象用作
OLEObject
或 shape
,这也适用于 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