2016-03-14 55 views
0

编辑:看到我的评论下面的部分解决方案。如何在不打开编辑器的情况下在VBA编辑器中动态打开类对象?

编辑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 

我来尝试使用此功能不同的东西,以帮助我了解访问将如何不同的可能的解决方案反应最近我在网上找:

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)被注释掉这个例子会打开一些东西,但它只能看到已经打开的东西,这对我没有帮助。我明白,有不同类型的模块,但我不知道如何区分和在线文档解释了一般差异,但没有透露任何联系类对象的方式,除非它已在编辑器中打开。希望有人可以帮助甚至纠正我的术语,如果它停用并引导我到现场的其他解决方案。

+0

我已经想出了一个部分解决方案。 我觉得自己做得这么复杂很愚蠢。如果您遇到类似的问题,可以简单地:DoCmd.OpenForm(变量),acDesign。 这将允许在VBA编辑器中访问其类对象实例。它将打开VBA编辑器,所以我只需要弄清楚如何防止它,或者找到一种方法来动态保存并关闭编辑器。 –

+0

我发现我可以使用:Application.VBE.MainWindow.Visible = False关闭它。它只是一秒开放,我不认为这是一个大问题。任何人都有另一种方式来完全隐藏它? –

回答

4

可以使用VBE对象模型,而不在VB编辑器中打开它来访问你的窗体的代码模块。通过这种方法,VB编辑器窗口不需要可见或打开。如果VB编辑器窗口未打开,以这种方式访问​​模块将不会打开它。所以我认为这符合你的问题的主要目标。

它可以使用与VBE后期绑定,但是因为你不熟悉它,你可能会希望使用早期绑定代替。如果是这样,请将Microsoft Visual Basic for Applications扩展性添加到项目的引用。

这是一个非常简单的过程,它只显示如何通过名称引用代码模块并打印模块属性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()一个不同的数字。我想你会发现这很快就会变得非常糟糕。:-)

A CodeModule对象有你应该找到有用的方法,包括: DeleteLines; Find; InsertLines;和ReplaceLine。然而,我不知道你想要用模块的代码做什么,所以将它留在那。

+1

谢谢!这非常有用,正是我所需要的。 –

相关问题