如何在不打开编辑器的情况下在VBA编辑器中动态打开类对象?

Sco*_*ody 0 ms-access vba access-vba ms-access-2010

编辑:请参阅下面的评论,了解部分解决方案.

编辑2:我找到了一个关闭VBA编辑器的适当解决方案,但只想知道是否有人知道如何让它在整个时间内完全不可见.我发现的东西可以满足我的需求,但我会为任何想要详细说明其他方法或扩展我的方法的人留下这个主题.

原帖:我有一个创建表,查询和表单的函数.对于表单,它复制模板表单并调用一个动态替换表单VBA代码的函数.我创建的下面的函数很有用,但是,如果我没有在编辑器中打开类对象表单,我得到运行时错误'2516':"Microsoft Access无法找到模块'SPCInputFormVBA.',其中SPCInputFormVBA是类对象名称的变量.为了进一步详细说明行为,如果我关闭了编辑器,只要模块或类对象在编辑器中打开,它仍然可以工作.我希望能够激活编辑器中的相应Form_xyz对象没有编辑器打开,这样我就可以使用这个函数来做一堆东西了.我使用的是模板形式,因为嵌入了很多东西并且有很多东西在继续我可以更改记录源和其他各种内容的形式,但到目前为止VBA部分对我来说是难以捉摸的.我认为打开对象很容易,但是我遇到了很多麻烦而无法找到方法描述我的问题导致我找到解决方案.

Public Function InputFormVBA(SPCInputFormVBA)


DoCmd.OpenModule (SPCInputFormVBA)
    Dim i As Integer

    With Application.Modules(SPCInputFormVBA)
        For i = 1 To .CountOfLines

            If InStr(.Lines(i, 1), "TempTable") > 0 Then

             '   .ReplaceLine i, "           If DCount( ""serial"", """ & tblName & """, _"

            End If

            'If Instr(.Lines(i, 1), "

        Next i
    End With
End Function
Run Code Online (Sandbox Code Playgroud)

我最接近的是尝试使用此功能的各种事情,以帮助我了解Access如何对我在网上找到的不同潜在解决方案做出反应:

Sub PrintOpenModuleNames()
    Dim i As Integer
    Dim modOpenModules As Modules

    Set modOpenModules = Application.Modules

    For i = 0 To modOpenModules.Count - 1

        Debug.Print modOpenModules(i).Name
        'DoCmd.OpenModule (modOpenModules(i).Name)

     Next

End Sub
Run Code Online (Sandbox Code Playgroud)

'DoCmd.OpenModule (modOpenModules(i).Name)在这个例子中注释掉,将打开的东西,但它只能看到事情是已经打开它并不能帮助我.我确实知道有不同类型的模块,但我不确定如何区分和在线文档解释了一般差异,但没有透露任何方式来接触类对象,除非它已在编辑器中打开.希望有人可以帮助甚至纠正我的术语,如果它已经关闭并引导我到网站上其他地方的现有解决方案.

Han*_*sUp 5

您可以使用VBE对象模型访问表单的代码模块,而无需在VB编辑器中打开它.使用该方法,VB Editor窗口不需要是可见的或打开的.如果VB Editor窗口未打开,以这种方式访问​​模块将无法打开它.所以我认为这满足了你问题的主要目标.

可以将VBE与后期绑定结合使用,但由于您不熟悉它,因此您可能希望使用早期绑定.如果是这样,请将Microsoft Visual Basic for Applications Extensibility添加到项目的引用中.

这是一个非常小的过程,它只向您展示如何通过名称引用代码模块并打印模块属性的2.

Public Sub InputFormVBA(ByVal SPCInputFormVBA As String)

    Dim objModule As CodeModule

    Set objModule = Application.VBE.VBProjects(1).VBComponents(SPCInputFormVBA).CodeModule
    With objModule
        Debug.Print .CountOfDeclarationLines
        Debug.Print .CountOfLines
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

如果您的数据库只包含一个VBA项目,VBProjects(1)则会引用它.但是,如果db包含多个VBA项目,则可能需要提供VBProjects()不同的数字.我认为你会认为这很快.:-)

一个CodeModule对象有方法,你应该找到有用的,其中包括: DeleteLines; Find; InsertLines; 和ReplaceLine.但是我真的不知道你想用模块的代码做什么,所以只留下它.