首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当VBE (代码窗口)没有打开时,为什么VBE.ActiveCodePane.CodeModule不能工作?

当VBE (代码窗口)没有打开时,为什么VBE.ActiveCodePane.CodeModule不能工作?
EN

Stack Overflow用户
提问于 2015-09-23 20:32:54
回答 3查看 4.5K关注 0票数 4

创建运行以下代码的窗体。

代码语言:javascript
复制
MsgBox (VBE.ActiveCodePane.CodeModule)

这个信息出现了。

现在保存、关闭和重新打开数据库,并看到以下消息:

运行时错误'91':对象变量或块变量未设置

如果打开Visual编辑器,它将再次运行。即使你关闭了VBE,它仍然在运行。

但是,当关闭整个应用程序并重新打开它时,关闭VBE,就会得到错误。

为什么?这里发生了什么事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-23 21:02:06

引用活动窗格对象。在激活窗格之前,不会设置该对象。因此,在打开VBE之前,还没有设置对象。一旦关闭了VBE,对象就会保持不变,所以仍然可以引用它。

要在不打开VBE的情况下获得ActiveCodepane对象的句柄,需要激活VBComponent,如下所示:

代码语言:javascript
复制
VBE.ActiveVBProject.VBComponents("Module1").Activate

您可以像这样激活任何VBComponent。

票数 6
EN

Stack Overflow用户

发布于 2015-09-23 21:01:37

VBE在应用程序第一次打开时关闭时,就没有ActiveCodePane了,您可以在加载表单时以一个条件来检查它:

代码语言:javascript
复制
If (Application.VBE.ActiveCodePane Is Nothing) Then MsgBox "ActiveCodePane is Nothing"

VBE存在,可以使用属性和方法,但是没有ActiveCodePane,这就是为什么要接收空引用异常。如果您在保存和关闭之前关闭了所有的VBE (除非某个模块由于某种原因而存在),那么仅仅打开这个CodePanes仍然会产生错误。您必须显式地打开一个CodePane,以设置'ActiveCodePane‘属性。

这说得通。您试图通过ActiveCodePane属性访问的是什么?或许我能帮你找到一条路?

编辑

想必,在开发此表单和相关模块时,您将知道它们的名称,并且能够使用与ActiveCodePane不同的方法,比如@Bas提到的方法。或者,您可以循环遍历active VBProject中的每个代码窗格,并尝试匹配某个名称或其他内容:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2019-11-06 09:33:33

方法

由于有时无法避免使用VBE功能,所以对我来说,一般的解决方案是.

  1. 确保初始化/激活相关工作簿VB项目(组件)
  2. 确保初始化/在打开后激活其他工作簿VB项目(组件)(如果它们的VBE属性/代码可能与此过程稍后的相关,则为)

VbeInit使用

要做到这一点,可以调用(参见下面的代码)

  • VbeInit 在某些事件的开头(例如Workbook_Open()事件)和
  • 只要刚刚打开相关工作簿(例如使用VbeInit someOpenedWorkbook ),就会使用Workbooks.Open(...)

例例

它适用于更简单的上述情况。更复杂的情况是,当您依赖工作簿中的工作表的CodeName时,这是非常明显和必要的。例如。

  • 如果允许用户重新使用Name,但是VB应用程序仍然应该通过它们的CodeName
  • 这样的工作表(例如,作为模板工作表)被复制(sheet.Copy ...)到其他工作簿。

然后,如果工作表CodeName已经激活(例如通过myVBComponent.Activate或在VBE中打开包含源表的工作簿),那么工作表VBComponent才会被复制。

VbeInit程序

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32748946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档