Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 清除ActiveX下拉框错误438_Excel_Vba - Fatal编程技术网

Excel 清除ActiveX下拉框错误438

Excel 清除ActiveX下拉框错误438,excel,vba,Excel,Vba,我有一个填充两个ActiveX下拉菜单的脚本。我有一个重置按钮,当按下该按钮时,会运行一个宏,填充下拉菜单的值字段。我已经包括了按下重置按钮时触发的宏 Sub UnhideAll() Application.ScreenUpdating = False Worksheets("Control Panel").Shapes.Range(Array("ComboBox1")).ControlFormat.Value = "Choosing Region" Worksheets("C

我有一个填充两个ActiveX下拉菜单的脚本。我有一个重置按钮,当按下该按钮时,会运行一个宏,填充下拉菜单的值字段。我已经包括了按下重置按钮时触发的宏

Sub UnhideAll()

Application.ScreenUpdating = False
    Worksheets("Control Panel").Shapes.Range(Array("ComboBox1")).ControlFormat.Value = "Choosing Region"
    Worksheets("Control Panel").Shapes.Range(Array("ComboBox2")).ControlFormat.Value = "Choosing Office"
    Worksheets("Global").Columns.EntireColumn.Hidden = False
    Worksheets("Global").Rows.EntireRow.Hidden = False
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub


我一直收到运行时错误438对象不支持此属性或方法。

工作表(…)之后的所有内容都是后期绑定的,因为
工作表
生成一个
对象
:您实际上是蒙着眼睛编码。通过告诉编译器您要使用的接口来帮助编译器-在本例中,
工作表

Dim ctrlPanelSheet As Worksheet
Set ctrlPanelSheet = ActiveWorkbook.Worksheets("Control Panel")
现在,针对
ctrlPanelSheet
的成员调用将在编译时进行验证,您将在其成员调用中获得IntelliSense/member完成

也就是说,
ControlFormat
是类的一个成员,但是您正在对
shaperage
对象调用它。当您对一个对象进行[late bound]成员调用时,对于该对象上不存在的成员,您会得到运行时错误438

但是,当您仅使用单个控件时,不需要
形状设置

ctrlPanelSheet.Shapes("ComboBox1").ControlFormat.Value = "..."
现在,这样做将引发类型不匹配错误-
ComboBox 1
看起来更像ActiveX控件,而不是表单控件(默认情况下类似于
下拉列表1
)-您希望获取该
MSForms.ComboBox
对象,您可以从工作表的
OLEObjects
集合中获取它:

Dim oleBox1 As OLEObject
Set oleBox1 = ctrlPanelSheet.OLEObjects("ComboBox1")
对象正在包装您的
MSForms.ComboBox
控件:

Dim box1 As MSForms.ComboBox
Set box1 = oleBox1.Object
现在,您有了一个
MSForms.ComboBox
对象,您可以使用
MSForms.ComboBox
对象执行所有通常可以执行的操作—所有操作都带有编译时验证:

box1.Value = "Test"

try:Worksheets(“controlpanel”).OLEObjects(“ComboBox1”).Object.Value=“selecting Region”@EvR可以正常工作,但它仍然是容易出错的后期绑定代码438。最好使用声明的类型并避免不必要的后期绑定。