你引用了活动窗格对象。该对象在窗格被激活之前并未设置。因此,在打开VBE之前,该对象尚未设置。一旦关闭VBE,该对象仍然存在,因此仍然可以引用它。
要获取ActiveCodepane对象的句柄,而不需要打开VBE,可以通过激活VBComponent来实现,如下所示:
VBE.ActiveVBProject.VBComponents("Module1").Activate
当第一次打开应用程序时,如果关闭了VBE
,则没有ActiveCodePane
,您可以在加载表单时的条件语句中检查此情况:
If (Application.VBE.ActiveCodePane Is Nothing) Then MsgBox "ActiveCodePane is Nothing"
VBE
是存在的,它的属性和方法可以使用,但是没有ActiveCodePane
,这就是为什么会出现空引用异常的原因。如果您在保存和关闭之前关闭了所有CodePanes
(除非有某种原因存在某个模块),那么仅打开VBE
仍将产生错误。必须明确地打开CodePane
,以设置“ActiveCodePane”属性。
ActiveCodePane
。或者,您可以循环遍历活动VBProject中的每个代码窗格,并尝试匹配名称或其他内容:Option Compare Database
Option Explicit
Private vbProj As VBIDE.VBProject
Private vbComp As VBIDE.VBComponent
Private vbMod As VBIDE.CodeModule
Private Sub Command0_Click()
Set vbProj = Application.VBE.ActiveVBProject
For Each vbComp In vbProj.VBComponents
MsgBox vbComp.CodeModule
Next
End Sub
Application.VBE.CodePanes
实际上只是打开的代码窗格集合,而不是所有的。在我的编辑中发布的方法适用于之前未打开过VBE的情况。 - Tyler StandishMan正如Bas Verlaat所说,在打开VBE之前,对象尚未设置。
显然,当用户使用程序时,VBE不会打开。仅在开发和调试时引用Active Code Pane,并且永远不要在生产中使用。
例如,以下自定义错误消息非常适用于调试,但如果部署到生产环境中,则会失败。
ErrorHandler:
MsgBox "Error " & Err.number & ": " & Err.Description & " in " & _
VBE.ActiveCodePane.CodeModule, vbOKOnly, "Error"
由于有时无法避免使用VBE功能,我通常的解决方案是...
VbeInit
用法为此,可以调用以下代码:
VbeInit
(例如Workbook_Open()
事件),以及Workbooks.Open(...)
),调用VbeInit someOpenedWorkbook
对于上述简单情况,它起作用。
更复杂的情况是,您依赖于工作簿中表格的CodeName
。 例如。
CodeName
在VB应用程序中得到唯一标识,sheet.Copy ...
)到其他工作簿中。然后,只有当工作表的VBComponent已被激活(例如通过myVBComponent.Activate
或在VBE中打开包含源工作表的工作簿)时,才会复制工作表的CodeName
。
VbeInit
过程Procedure VbeInit(Optional wb As Workbook)
With Application.VBE
Dim pj As VBProject: For Each pj In .VBProjects
'ignore unsaved (=> fully initialized) workbooks
If Not wb Is Nothing Then If wb.FullName <> VBProjFilename(pj) Then GoTo continue
Dim c As VBComponent: For Each c In pj.VBComponents
c.Activate
Next c
continue:
Next pj
End With
End Procedure
Function VBProjFilename(pj As VBProject) As String
On Error Resume Next 'leave result empty if workbook (code) not saved yet
VBProjFilename = pj.Filename
End Function
Workbook_Open()
处理程序中遇到了问题,下面Bas Verlaat提供的...Activate
解决方案很好地解决了它。奇怪的是,在这个错误中Err
对象不可用,所以调试起来非常奇怪。 - Andreas Covidiot