Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 VBA:调用位于另一个wb中的组合框_Vba_Excel - Fatal编程技术网

Excel VBA:调用位于另一个wb中的组合框

Excel VBA:调用位于另一个wb中的组合框,vba,excel,Vba,Excel,在编写VBA代码时,我尝试调用组合框_Change Sub(非Private Sub),它位于另一个名为“wb2”的工作簿的“Sheet2”中 Call wb2.Sheet2.ComboBox_Change 但是,程序返回运行时错误438。我是不是漏掉了什么,或者有人能帮我解决吗?谢谢 运行时错误438:对象不支持此属性或方法 事件处理程序只做一件事:它们处理事件。这就是为什么它们是私有的:它们不需要被任何其他代码显式调用——它们由各自的事件源period调用 如果这在每种语

在编写VBA代码时,我尝试调用组合框_Change Sub(非Private Sub),它位于另一个名为“wb2”的工作簿的“Sheet2”中

    Call wb2.Sheet2.ComboBox_Change
但是,程序返回运行时错误438。我是不是漏掉了什么,或者有人能帮我解决吗?谢谢

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


事件处理程序只做一件事:它们处理事件。这就是为什么它们是私有的:它们不需要被任何其他代码显式调用——它们由各自的事件源period调用

如果这在每种语言中都是不好的做法,我会不厌其烦地找到一篇关于这一点的帖子,那么在VBA中为什么会有什么不同呢?提示:事实并非如此,显式调用事件处理程序是个坏主意的原因完全是语言无关的(前提是您的语言有“事件”的概念)

不要将它们公开,然后显式地调用它们。相反,让其他代码切换控件的状态,并让控件触发其事件-假设是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
然后像调用其他工作簿中的任何其他宏一样调用
DoStuff


请注意,
Call
关键字是完全冗余的。

wb2
可能是一个
Workbook
对象,它没有
sheet2
属性。您必须使用工作表选项卡名称:
例如调用wb2.Sheets(“Sheet2”).ComboBox\u Change
。查看以下用于WithEvents的链接:@Rory谢谢!现在可以了。我应该在问这个问题之前尝试一下:你不想显式地调用事件处理程序。您希望切换combobox状态,其副作用是为其调用处理程序。如果希望副作用没有控件状态切换,那么让处理程序调用公共过程,并从另一本书中调用相同的过程。不要将处理程序公开,而是编写更好的代码。在这种情况下,
public DoStuff(SomeUsefulParameter作为SomeUsefulType)
可以广泛重用。例如,您的处理程序或主代码可以将相关工作表传递给
DoStuff
例程,并且您可以将其用于任何符合逻辑的工作表。但是我相信你已经想到了:-)@AJD绝对-在OP中根本没有足够的肉来知道
DoStuff
应该做什么:)
Public Sub DoStuff()
    'do stuff
End Sub