英文:
In VBA is it possible to get the value of a button on a worksheet which is stored as a variable?
问题
In 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),因此不认为会有这个成员存在?或者我完全错了吗?
不管怎样,是否有解决方法?(或者我是否做了一些愚蠢的事情?)如果没有,那也不是世界末日,但通常我喜欢将对工作表的硬编码引用的数量降到最低,所以如果这是一种解决方法,那就太好了。
英文:
In VBA is there a way to refer to a button on a worksheet that's held as a variable? Unless I refer to the sheet directly it seems to throw a compile error for "Method or data member not found". So for example:
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
The above triggers the error on the debug.print line. Whereas the following works without issue:
Sub Test2
debug.print Sheet1.Example_Button.Value
End Sub
My gut says that this is because in the second case the compiler looks at a direct reference (e.g. Sheet1) and can see that the button exists as a member, whereas in the first case it looks at the variable and views it as a generic worksheet type (rather than being Sheet1) and so doesn't think there would be this member? Or maybe I'm completely off the mark?
Either way, is there a way around it? (Or am I doing something stupid for that matter?) If not it's not the end of the world, but I typically like to minimise the number of hard-coded references to sheets so if this is a way to resolve it then that would be great.
答案1
得分: 3
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
这将起作用。实际上,声明为 As Variant
或 As Object
可以模拟下面的 Sub
,允许声明参数为涉及的工作表类别。唯一一个以你尝试的方式公开对象的子程序是:
Sub Test_ChildSheetSh1(ByVal Temp_WS As Sheet1)
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
英文:
Example_Button
, as an ActiveX
OLEObject
is a member of Sheet1
and it can be referenced as Sheet1.Example_Button
.
But it is also an OLEObject
and a shape
, too.
You cannot find it as a member of the general Worksheet
object. You can use the Sub
as you try, generally declaring the parameter As Variant
(or As Object
), passing the Sheet1
class itself:
Sub Test_Child(ByVal Temp_WS as Variant)
Debug.Print Temp_WS.Example_Button.Value
End Sub
And this will work. Practically, declaring As Variant
or As Object
it simulates the next Sub
, which allows declaring he parameter as the involved sheet class. The single one exposing the object in the way you try:
Sub Test_ChildSheetSh1(ByVal Temp_WS As Sheet1)
Debug.Print Temp_WS.Example_Button.Value
End Sub
But better approaches are to use the object as OLEObject
or as shape
, which works for Worksheet
object, too:
Sub Test_ChildOLE(ByVal Temp_WS as Worksheet)
Debug.Print Temp_WS.OLEObjects("Example_Button").Object.Value
End Sub
or
Sub Test_ChildSh(ByVal Temp_WS As Worksheet)
Debug.Print Temp_WS.Shapes("Example_Button").OLEFormat.Object.Object.Value
End Sub
You can event use Worksheet
for a Form
type button (not an ActiveX
) in the next way:
Sub Test_ChildForm(ByVal Temp_WS As Worksheet)
Debug.Print Temp_WS.Shapes("Example_Button").OLEFormat.Object.Caption
End Sub
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论