Excel VBA:调用位于另一个wb中的ComboBox_Change

时间:2018-06-12 18:51:33

标签: excel vba excel-vba

在编写VBA代码时,我尝试调用一个Combobox_Change Sub(非Private Sub),它位于另一个名为'wb2'的工作簿的'Sheet2'中。

    Call wb2.Sheet2.ComboBox_Change

然而,程序返回运行时错误438.我错过了什么或者有人可以提供修复吗?谢谢!

  

运行时错误438:对象不支持此属性或方法

1 个答案:

答案 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关键字完全是多余的。