将具有多个表的Access数据库导出到具有多个工作表的Excel

时间:2013-07-04 10:12:32

标签: excel ms-access access-vba

标题说明了一切。我正在尝试编写一个允许我在Access中运行的VBA脚本,它会将所有数据库表作为单独的表导出到Excel文件中,并且与数据库同名:

Sub exportTablesToXLS()
    Dim td As DAO.TableDef, db As DAO.Database
    Dim out_file As String

    out_file = CurrentProject.Path & "\" & db.DatabaseName & ".xls"

    Set db = CurrentDb()
    For Each td In db.TableDefs
        If Left(td.Name, 4) = "MSys" Then
            'We do not need MSys tables in excel file
        Else
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
            td.Name, out_file, True, Replace(td.Name, "dbo_", "") 'We do not need dbo prefix in sheetnames
        End If
    Next
End Sub

我遇到的问题我希望得到你的帮助:

  • 请参阅第out_file行 - > db.DatabaseName返回错误。如何正确获取当前Access数据库的数据库名称?
  • 我也想输出一个日志文件(简单的文本文件)。如何为每个数据库表读取已导出的行数并报告发生的最终错误?

非常感谢任何改进此脚本的帮助: - )

1 个答案:

答案 0 :(得分:0)

您的 db 变量未引用当前数据库(但是 - 它在以下行中设置),属性为Name(我没有遇到{{} 1}}):

DatabaseName

Name提供完整路径和文件名,第二个MsgBox将其减少为文件名。 (可能有另一种获取文件名的方法,而不必解析Sub Test() Dim db As DAO.Database Set db = CurrentDb Dim sLast As String MsgBox db.Name 'F:\Documents and Settings\student\My Documents\Staff Database.accdb sLast = InStrRev(db.Name, "\") MsgBox Right(db.Name, Len(db.Name) - sLast) 'Staff Database.accdb End Sub ..)

要获取导出的行数,您可以为表打开Name,读取Recordset属性。可以使用 FileSystemObject 对象创建文本文件。示例代码:

RecordCount

甚至只是简单文件(VBA)I / O:

Set fso = CreateObject("Scripting.FileSystemObject")

Set oFile = FSO.CreateTextFile(strPath)
oFile.WriteLine "test" 
oFile.Close

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 更容易使用)

报告错误,您需要创建自己的错误处理例程和错误记录过程。这已经在以前完成,稍微搜索就会发现一些代码。实质上,每个(重要)事件都有调用日志记录过程的错误处理代码。此过程在表中创建记录以存储所有相关信息:日期,时间,打开的表格等等。

Google快速发现this page有关记录访问错误的信息。