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

时间:2016-03-14 20:56:01

标签: vba ms-access 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

我最接近的是尝试使用此功能进行各种操作,以帮助我了解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

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

1 个答案:

答案 0 :(得分: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

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

CodeModule对象具有您应该发现有用的方法,包括: DeleteLines; Find; InsertLines;和ReplaceLine。但是,我真的不知道你想对模块的代码做什么,所以只需将它留在那里。