创建运行以下代码的窗体。
MsgBox (VBE.ActiveCodePane.CodeModule)这个信息出现了。

现在保存、关闭和重新打开数据库,并看到以下消息:
运行时错误'91':对象变量或块变量未设置

如果打开Visual编辑器,它将再次运行。即使你关闭了VBE,它仍然在运行。
但是,当关闭整个应用程序并重新打开它时,关闭VBE,就会得到错误。
为什么?这里发生了什么事?
发布于 2015-09-23 21:02:06
引用活动窗格对象。在激活窗格之前,不会设置该对象。因此,在打开VBE之前,还没有设置对象。一旦关闭了VBE,对象就会保持不变,所以仍然可以引用它。
要在不打开VBE的情况下获得ActiveCodepane对象的句柄,需要激活VBComponent,如下所示:
VBE.ActiveVBProject.VBComponents("Module1").Activate您可以像这样激活任何VBComponent。
发布于 2015-09-23 21:01:37
当VBE在应用程序第一次打开时关闭时,就没有ActiveCodePane了,您可以在加载表单时以一个条件来检查它:
If (Application.VBE.ActiveCodePane Is Nothing) Then MsgBox "ActiveCodePane is Nothing"VBE存在,可以使用属性和方法,但是没有ActiveCodePane,这就是为什么要接收空引用异常。如果您在保存和关闭之前关闭了所有的VBE (除非某个模块由于某种原因而存在),那么仅仅打开这个CodePanes仍然会产生错误。您必须显式地打开一个CodePane,以设置'ActiveCodePane‘属性。

这说得通。您试图通过ActiveCodePane属性访问的是什么?或许我能帮你找到一条路?
编辑
想必,在开发此表单和相关模块时,您将知道它们的名称,并且能够使用与ActiveCodePane不同的方法,比如@Bas提到的方法。或者,您可以循环遍历active 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发布于 2019-11-06 09:33:33
方法
由于有时无法避免使用VBE功能,所以对我来说,一般的解决方案是.
VbeInit使用
要做到这一点,可以调用(参见下面的代码)
VbeInit 在某些事件的开头(例如Workbook_Open()事件)和VbeInit someOpenedWorkbook ),就会使用Workbooks.Open(...)。例例
它适用于更简单的上述情况。更复杂的情况是,当您依赖工作簿中的工作表的CodeName时,这是非常明显和必要的。例如。
Name,但是VB应用程序仍然应该通过它们的CodeName和sheet.Copy ...)到其他工作簿。然后,如果工作表CodeName已经激活(例如通过myVBComponent.Activate或在VBE中打开包含源表的工作簿),那么工作表VBComponent才会被复制。
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 Functionhttps://stackoverflow.com/questions/32748946
复制相似问题