在VBA中,无法从工作簿事件处理程序工作簿\u BeforeClose或工作簿\u Deactivate()调用工作表中的子例程

在VBA中,无法从工作簿事件处理程序工作簿\u BeforeClose或工作簿\u Deactivate()调用工作表中的子例程,vba,events,scope,event-handling,subroutine,Vba,Events,Scope,Event Handling,Subroutine,我正在制作一个启用Excel VBA的WorkbookRES项目透视图,它有一个主表/工作表RES项目工作表,其中每行上都有一个超链接,可以打开另一个workbook0520-077-LACOFD-FJF-log.xlsm,其中Sheet1Project log也启用了VBA。 当workbook..log.xlsm与Sheet1项目日志一起填写辅助表时,我希望在主表RES项目表中更新其中的一些更改 更新子例程UpdateMainProject表位于Sheet1项目日志中。当从Workbench

我正在制作一个启用Excel VBA的WorkbookRES项目透视图,它有一个主表/工作表RES项目工作表,其中每行上都有一个超链接,可以打开另一个workbook0520-077-LACOFD-FJF-log.xlsm,其中Sheet1Project log也启用了VBA。 当workbook..log.xlsm与Sheet1项目日志一起填写辅助表时,我希望在主表RES项目表中更新其中的一些更改

更新子例程UpdateMainProject表位于Sheet1项目日志中。当从Workbench_changed事件调用时,它可以工作,但当我尝试在Workbench events Workbench_以布尔形式关闭Cancel或Workbench_Deactivate之前从Workbench events Workbench_调用update子例程时,我得到了未定义的编译错误子函数或函数。 考虑到这是一个范围错误,我还尝试命名子例程Sheet1.UpdateMainProjectTable,但随后出现运行时错误1004应用程序定义错误或对象定义错误

下面是工作簿中使用的四个事件处理程序示例。我尝试了每种方法,它们在尝试调用UpdateMainProjectTable时都产生了一个错误。在前两个版本中,它们仅在一起作为参考。此外,我还包括了项目结构和错误的图片,以供参考

下面的两个子例程位于Woorkbook中,因此我将其前缀设为Sheet1。当他们试图调用Sheet1.UpdateMainProjectTable时,我收到运行时错误1004应用程序定义或对象定义错误

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then Me.Save
Application.EnableEvents = False
Sheet1.UpdateMainProjectTable
Application.EnableEvents = True
End Sub


Private Sub Workbook_Deactivate()
Application.EnableEvents = False
Sheet1.UpdateMainProjectTable
Application.EnableEvents = True
End Sub 
下面的两个子例程都在Woorkbook中,我不给它加前缀。当他们试图调用UpdateMainProjectTable时,我收到了编译错误子或未定义的函数

Private Sub Workbook_Deactivate()    
 Application.EnableEvents = False
UpdateMainProjectTable
Application.EnableEvents = True    
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 If Me.Saved = False Then Me.Save
 Application.EnableEvents = False
UpdateMainProjectTable
Application.EnableEvents = True    
End Sub
根据一个答案的建议,我尝试了这个

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then Me.Save
Application.EnableEvents = False
With Sheet1
Call UpdateMainProjectTable
End With
Application.EnableEvents = True
End Sub 
但是我没有定义编译错误子函数或函数。 下面是Sheet1项目日志中声明为公共的子程序

我希望这有帮助

确保您的sub是公共的:

要调用此sub,请执行以下操作:

With Sheet1
    Call UpdateMainProjectTable
End With
因此,您的代码应如下所示:

Private Sub Workbook_Deactivate()    
Application.EnableEvents = False
With Sheet1
    Call UpdateMainProjectTable
End With
Application.EnableEvents = True    
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then Me.Save
Application.EnableEvents = False
With Sheet1
    Call UpdateMainProjectTable
End With
Application.EnableEvents = True    
End Sub
确保您的sub是公共的:

要调用此sub,请执行以下操作:

With Sheet1
    Call UpdateMainProjectTable
End With
因此,您的代码应如下所示:

Private Sub Workbook_Deactivate()    
Application.EnableEvents = False
With Sheet1
    Call UpdateMainProjectTable
End With
Application.EnableEvents = True    
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then Me.Save
Application.EnableEvents = False
With Sheet1
    Call UpdateMainProjectTable
End With
Application.EnableEvents = True    
End Sub
为了从图纸模块调用子/函数,它不能是私有的,必须显式调用它

如果您的程序不是私有的,并且存在于Sheet1中,我认为问题应该在调用的Sub中,可能性较小

我觉得还需要强调Sheet1不是图纸名称!它是图纸模块名称。我的意思是,在VBE中查看工作表模块时,可以看到如下内容:Sheet1您的工作表名称。如果Sheet1是括号之间的名称,则它将是错误的。。。除非两者相同

已编辑:我现在可以看到您的sub.正在讨论工作簿\u停用事件调用:

fileName=ActiveWorkbook.Name的含义不同,因为在停用后,另一个工作簿处于活动状态。因此,请尝试改用fileName=ThisWorkbook.Name。对Workbooks.OpenActiveWorkbook.Path&…执行相同的操作,在Workbooks.OpenThisWorkbook.Path&…中转换它

最好也发布CheckIfWBOpen函数代码,或者至少检查其代码中是否不存在类似的内容

调用ExtractProjectdFromFileName时使用了错误的工作簿名称—活动工作簿名称。我不知道它的代码中还可能存在哪些其他引用

由于还有一些其他函数调用GetMatchRowNumber,因此还必须从类似的角度分析这些过程

现在,我建议您尝试用下一种方式调试此事件中的调用:

按建议使用此工作簿更改活动工作簿

在特定行上放置一个断点,然后按F8键逐行运行代码,当代码在停用后停止并查看在哪一行引发错误时

为了从图纸模块调用子/函数,它不能是私有的,必须显式调用它

如果您的程序不是私有的,并且存在于Sheet1中,我认为问题应该在调用的Sub中,可能性较小

我觉得还需要强调Sheet1不是图纸名称!它是图纸模块名称。我的意思是,在VBE中查看工作表模块时,可以看到如下内容:Sheet1您的工作表名称。如果Sheet1是括号之间的名称,则它将是错误的。。。除非两者相同

已编辑:我现在可以看到您的sub.正在讨论工作簿\u停用事件调用:

fileName=ActiveWorkbook.Name的含义不同,因为在停用后,另一个工作簿处于活动状态。因此,请尝试改用fileName=ThisWorkbook.Name。对Workbooks.OpenActiveWorkbook.Path&…执行相同的操作,在Workbooks.OpenThisWorkbook.Path&…中转换它

也可以发布CheckIfWBOpen函数代码,或者至少检查在insi中是否不存在类似的东西 对其代码进行编码

调用ExtractProjectdFromFileName时使用了错误的工作簿名称—活动工作簿名称。我不知道它的代码中还可能存在哪些其他引用

由于还有一些其他函数调用GetMatchRowNumber,因此还必须从类似的角度分析这些过程

现在,我建议您尝试用下一种方式调试此事件中的调用:

按建议使用此工作簿更改活动工作簿

在特定行上放置一个断点,然后按F8键逐行运行代码,当代码在停用后停止并查看在哪一行引发错误时



你能显示UpdateMainProjectTable的代码吗?@Dorian我用UpdateMainProjectTable的代码更新了我的问题。在模块表1项目日志中。当从工作表中的事件调用时,它可以工作。你能显示UpdateMainProjectTable的代码吗?@Dorian我用UpdateMainProjectTable的代码更新了我的问题。在模块表1项目日志中。它在从工作表中的事件调用时工作。不必是公共的。有必要不公开。此外,工作表模块中的过程只能显式调用,调用时使用工作表模块名称…@FaneDuru它声明的public,我尝试使用语句Sheet1.UpdateMainProjectTable调用它。我收到运行时错误1004应用程序定义错误或对象定义错误。@Frank:你读过我的答案了吗?所有这些。。。如果是的话,最好对我的答案发表评论。不需要给我贴标签。。。事实上,“Sheet1”是什么?图纸名称还是图纸模块名称?你能区分这两个概念吗?收到该错误是正常的,因为调用超出了工作表模块的作用域。@Dorian我尝试了您的建议,但得到了一个未定义的编译错误子或函数。@FaneDuru是的,我读过了。我想我明白了。sub是公开的。我试着用Sheet1作为sub的前缀。项目日志表的模块名称。我在问题中添加了UpdateMainProjectTable sub的代码。我希望这会有帮助。不必公开。有必要不公开。此外,工作表模块中的过程只能显式调用,调用时使用工作表模块名称…@FaneDuru它声明的public,我尝试使用语句Sheet1.UpdateMainProjectTable调用它。我收到运行时错误1004应用程序定义错误或对象定义错误。@Frank:你读过我的答案了吗?所有这些。。。如果是的话,最好对我的答案发表评论。不需要给我贴标签。。。事实上,“Sheet1”是什么?图纸名称还是图纸模块名称?你能区分这两个概念吗?收到该错误是正常的,因为调用超出了工作表模块的作用域。@Dorian我尝试了您的建议,但得到了一个未定义的编译错误子或函数。@FaneDuru是的,我读过了。我想我明白了。sub是公开的。我试着用Sheet1作为sub的前缀。项目日志表的模块名称。我在问题中添加了UpdateMainProjectTable sub的代码。我希望这能有所帮助。@Frank:看来我们得出了我的答案:如果您的程序不是私有的,并且存在于Sheet1中,那么问题应该在被调用的Sub中。现在,我可以看到您在讨论中发布了Sub。我将编辑我的答案,并参考上面提到的代码。@Frank:很高兴你能在这里解决它。在VBA中,接收错误的时间可能远远早于引发错误的行。通常,当您从另一个应用程序调用子窗体(例如,Corel VBA窗体中的子窗体)时,经常会发生这种情况,在调用的子窗体上始终显示错误,即使它调用了另一个子窗体,并且错误发生在第三个调用的子窗体上。这就是为什么我建议问题可能在被调用的过程中。我很高兴能帮助你解决问题。但我仍然不明白你为什么不评论我的答案…@弗兰克:这个答案可能会被删除,我们所有的评论都会消失,其他有兴趣从历史问题中学习的人不会理解太多。。。你找到错误的地方了吗?@Frank:看来我们找到了我的答案:如果你的程序不是私有的,并且存在于Sheet1中,那么问题应该在被调用的Sub中。现在,我可以看到你在讨论中发布了Sub。我将编辑我的答案,并参考上面提到的代码。@Frank:很高兴你能在这里解决它。在VBA中,接收错误的时间可能远远早于引发错误的行。通常,当您从另一个应用程序调用子窗体(例如,Corel VBA窗体中的子窗体)时,经常会发生这种情况,在调用的子窗体上始终显示错误,即使它调用了另一个子窗体,并且错误发生在第三个调用的子窗体上。这就是为什么我建议问题可能在被调用的过程中。我很高兴能帮助你解决问题。但我还是不明白为什么
你不要评论我的答案…@Frank:这个答案可能会被删除,我们所有的评论都会消失,其他有兴趣从历史问题中学习的人不会理解太多。。。你找到错误的地方了吗?
Sheet1.UpdateMainProjectTable