在编写VBA代码时,我尝试调用一个Combobox_Change Sub(非Private Sub),它位于另一个名为'wb2'的工作簿的'Sheet2'中。
Call wb2.Sheet2.ComboBox_Change
然而,程序返回运行时错误438.我错过了什么或者有人可以提供修复吗?谢谢!
运行时错误438:对象不支持此属性或方法
答案 0 :(得分:1)
事件处理程序做一件事:他们处理事件。这就是为什么它们是Private
:它们永远不需要被任何其他代码显式调用 - 它们由它们各自的事件源,句点调用。
如果在每种语言中都是不好的做法,我可能会因为找到关于此问题的SO帖子而烦恼,那为什么VBA会有什么不同呢?提示:事实并非如此,明确调用事件处理程序的原因是一个坏主意,完全与语言无关(假设您的语言有“事件”概念)。
不要使它们Public
然后显式调用它们。相反,让其他代码切换控件的状态,让控件触发它的事件 - 假设一个ActiveX / MSForms控件:
Dim ctrl As MSForms.ComboBox
Set ctrl = wb.Worksheets("Sheet2").OLEObjects("ComboBox1").Object
ctrl.Value = Not ctrl.Value
如果您不想切换控件的状态,只需调用其处理程序,然后将处理程序的实现拉出来 - 而不是:
Private Sub ComboBox_Change()
'do stuff
End Sub
这样做:
Private Sub ComboBox_Change()
DoStuff
End Sub
Public Sub DoStuff()
'do stuff
End Sub
然后像调用任何其他宏在另一个工作簿一样调用DoStuff
。
请注意,Call
关键字完全是多余的。