将具有多个表的 Access 数据库导出到具有多个工作表的 Excel
Posted
技术标签:
【中文标题】将具有多个表的 Access 数据库导出到具有多个工作表的 Excel【英文标题】:Export Access database with multiple tables to Excel with multiple sheets 【发布时间】:2013-07-04 10:12:32 【问题描述】:标题说明了一切。我正在尝试编写一个 VBA 脚本,它允许我在 Access 中运行,它将所有数据库表作为单独的工作表导出到与数据库同名的 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】:你的 db 变量没有引用当前数据库(还 - 在下一行设置),属性是Name
(我没遇到过DatabaseName
) :
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 给出完整的路径和文件名,第二个 MsgBox 将其简化为文件名。
(可能有另一种方法来获取文件名而无需解析Name
..)
要获得导出的行数,您可以为表打开Recordset
,读取RecordCount
属性。可以使用 FileSystemObject 对象创建文本文件。示例代码:
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = FSO.CreateTextFile(strPath)
oFile.WriteLine "test"
oFile.Close
甚至只是简单的文件 (VBA) I/O:
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
(FileSystemObject
更容易使用)
要报告错误,您需要创建自己的错误处理例程和错误记录程序。这已经在之前完成了,稍微搜索一下就会发现一些代码。本质上,每个(重要的)事件都有调用日志记录过程的错误处理代码。此过程在表中创建一条记录以存储所有相关信息:日期、时间、打开的表单等。
快速的 Google 发现 this page 关于记录访问错误。
【讨论】:
以上是关于将具有多个表的 Access 数据库导出到具有多个工作表的 Excel的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access - 具有来自不同表的多个条件的 Dlookup
将多个 html 表转换为具有多个工作表的 Excel 工作簿
MS Access VBA:创建具有多个工作表的 Excel 工作簿