VBA中如何通过变量引用工作表按钮?编译错误问题求解
VBA通过变量引用工作表按钮的问题解答
你的猜测是否正确?
完全正确。
Sheet1是VBA为你的工作表自动生成的专属类实例(并非通用的Worksheet类型),这个类会自动包含工作表上所有已添加控件的成员定义,因此编译器能直接识别Sheet1.Example_Button。而你定义的Temp_WS是通用的Worksheet类型,属于Excel对象模型的基类,它的定义里不包含你自定义添加的按钮成员,所以编译时会提示“未找到方法或数据成员”。
解决办法
方法1:通过控件集合引用(推荐,通用可靠)
根据按钮的类型(表单控件/ActiveX控件),使用工作表的Shapes或OLEObjects集合定位按钮:
Sub Test_Child(ByVal Temp_WS As Worksheet) ' 若为表单控件按钮(Forms.CommandButton) Debug.Print Temp_WS.Shapes("Example_Button").ControlFormat.Value ' 若为ActiveX控件按钮(MSForms.CommandButton) Debug.Print Temp_WS.OLEObjects("Example_Button").Object.Value End Sub
这种方式不需要硬编码工作表,只需确保按钮名称准确即可。
方法2:动态调用成员(简化写法)
使用CallByName函数跳过编译检查,动态访问按钮成员:
Sub Test_Child(ByVal Temp_WS As Worksheet) Debug.Print CallByName(Temp_WS, "Example_Button", VbGet).Value End Sub
注意:这种方式编译时不会验证按钮是否存在,若按钮名称拼写错误,会在运行时报错。
方法3:自定义强类型工作表类(适合频繁引用场景)
如果需要多次强类型引用该工作表的控件,可以自定义类:
- 插入类模块,命名为
CustomWorksheet - 在类模块中添加代码:
Public WS As Worksheet ' 根据按钮类型选择定义,这里以ActiveX按钮为例 Public Example_Button As MSForms.CommandButton
- 在调用代码中绑定控件:
Sub Test_Parent() Dim customWS As New CustomWorksheet Set customWS.WS = Sheet1 ' 这里可替换为动态获取的工作表对象 Set customWS.Example_Button = customWS.WS.OLEObjects("Example_Button").Object Call Test_Child(customWS) End Sub Sub Test_Child(ByVal Temp_WS As CustomWorksheet) Debug.Print Temp_WS.Example_Button.Value End Sub
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

