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

问题描述 投票:0回答:1

在 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),所以认为不会有这个成员?或者也许我完全偏离了目标?

无论哪种方式,有办法解决吗? (或者我是否为此做了一些愚蠢的事情?)如果不是,那不是世界末日,但我通常喜欢最大限度地减少对工作表的硬编码引用的数量,所以如果这是解决它的方法,那么那就是太棒了。

excel vba button compiler-errors
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.