在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

Posted

技术标签:

【中文标题】在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA【英文标题】:Run VBA Code in Excel to obtain VBA in Access Databases 【发布时间】:2015-02-04 18:11:55 【问题描述】:

我想在 Excel 中创建一个程序,该程序循环访问 Access 数据库列表并编写 Access 模块中存在的 VBA。我找到了一些可以从 Access 运行的代码,这些代码编写了 Access 模块中存在的 VBA。我试图弄清楚如何从 Excel 中引用数据库文件并在每个数据库文件上运行程序。我可能能够弄清楚如何遍历数据库文件。我只需要在下面的代码中引用数据库文件的帮助。

我可以这样打开数据库:

Dim cstrDbFile As String = "C:\Database51.accdb"
Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
objShell.Run cstrDbFile

我还尝试像这样设置对 Access 的引用:

Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase ("C:\Database51.accdb")

我需要弄清楚如何在以下位置引用 Access 数据库:

Application.VBE.ActiveVBProject.VBComponents

我可能需要弄清楚如何创建一个引用来替换 ActiveVBProject。

下面是我找到的一些代码,它写入了 VBA 模块的内容。我不记得我在哪里找到的。

For Each Component In Application.VBE.ActiveVBProject.VBComponents
    With Component.CodeModule

        'The Declarations
        For Index = 1 To .CountOfDeclarationLines
            Debug.Print .Lines(Index, 1)
        Next Index

        'The Procedures
        For Index = .CountOfDeclarationLines + 1 To .CountOfLines
            Debug.Print .Lines(Index, 1)
        Next Index

    End With

Next Component

【问题讨论】:

VbComponent 有一个导出方法,它比遍历每个模块中的每一行要快得多。 christopherjmcclellan.wordpress.com/2014/10/10/vba-and-git 【参考方案1】:

下面的代码可以让你看到 Access 数据库对象,但是我不知道如何导出代码(DoCmd 不在 Excel 中?)。通过 Access 完成您的任务将非常简单,所以我会重新考虑...

Option Explicit

' Add a reference to the DAO Object Library

Sub Read_Access_VBA()
    Dim dbs         As DAO.Database
    Dim ctr         As DAO.Container
    Dim doc         As DAO.Document
    Dim iC          As Integer
    Dim iD          As Integer
    Dim i           As Integer
    Dim mdl         As Module

    Set dbs = DBEngine.OpenDatabase("c:\TEMP\106thRoster.mdb", False, False, _
                                        "MS Access;")
    Debug.Print "----------------------------------------"

    For iC = 0 To dbs.Containers.Count - 1
        Debug.Print "Container: " & dbs.Containers(iC).Name
        If dbs.Containers(iC).Documents.Count > 0 Then
            For iD = 0 To dbs.Containers(iC).Documents.Count - 1
                Debug.Print vbTab & "Doc: " & dbs.Containers(iC).Documents(iD).Name
            Next iD
        Else
            Debug.Print "    No Documents..."
        End If
    Next iC

    'Set ctr = dbs.Containers!Modules

    dbs.Close
    Set doc = Nothing
    Set ctr = Nothing
    Set dbs = Nothing
End Sub

【讨论】:

【参考方案2】:

我找到了一些可以帮助我实现最终目标的代码:Exporting MS Access Forms and Class / Modules Recursively to text files?

以下是最重要的几行,可以让我在项目中取得进展。

LineCount = oApp.Forms(Name).Module.CountOfLines
  FileName = Path & "\" & Name & ".vba"

F = FreeFile
  Open FileName For Output Access Write As #F
  Print #F, oApp.Forms(Name).Module.Lines(1, LineCount)
  Close #F

【讨论】:

以上是关于在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA的主要内容,如果未能解决你的问题,请参考以下文章

excel vba 运行时错误

EXCEL根据单元格名称改变后自杀,求VBA代码!

使用 VBA 在 Excel 中的 SQL 表上使用参数化查询

尝试从 Access 运行 Excel 以格式化导出的表,获取所需的对象错误

为多个选定的 Excel 文件运行 vba

使用VBA获取Excel中所有复选框的值