使用表作为工作表的文件夹中的每个Access文件(.mdb)创建一个Excel文件

时间:2019-05-10 10:04:43

标签: ms-access access-vba ms-access-2010

任务

外部程序正在不断生成小的.mdb数据库文件。数据库表中的数据必须加载到STATA中进行数据处理。

到目前为止,我创建的工作流程是:

  • 第1步:使用VBA宏(在Access中)将表格提取到Excel工作簿中的表格中
  • 第2步:使用另一个VBA宏(在Excel中)清理用于STATA导入的变量
  • 第3步:使用插件xls2dta(在STATA中)将工作表合并到单个.dta文件中

我可以一次为一个文件执行此操作,但是我希望一次运行最多100个.mbd文件的文件夹中执行此操作。

(这个问题尤其与第1步有关,但是我将其余内容作为上下文添加。如果您有更好或更直接的途径来完成主要任务,请在评论中告诉我)。

单个文件第1步的工作代码:

以下是我用来为单个文件创建.xls的VBA宏(此答案的代码的修改版本:https://stackoverflow.com/a/13248627/1685346):

// Throws a ReferenceError that `object_name` is not defined.
(function() {})(object_name.property_name = 2)

第1步的几乎工作代码作为批处理操作

使用Sub exportTables2XLS() Dim table As DAO.TableDef, database As DAO.Database Dim filePath As String, file As String, outFile As String filePath = CurrentProject.Path file = CurrentProject.Name Set database = CurrentDb() 'Export all tables to outFile outFile = filePath & "\" & Left(file, Len(file) - 4) & ".xls" For Each table In database.TableDefs If Left(table.Name, 4) = "MSys" Then 'Do nothing -- Skip system tables Else DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _ table.Name, outFile, True, Replace(table.Name, "dbo_", "") End If Next End Sub 遍历文件夹将得到以下内容:

Dir

此宏为文件夹中的每个.mdb生成一个.xls文件,但是它们都包含与运行该宏的.mdb中的表相对应的工作表。我觉得这非常接近,但是如何获取代码以产生正确的输出呢?

1 个答案:

答案 0 :(得分:1)

此问题是因为DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, table.Name, outFile, True, Replace(table.Name, "dbo_", "")发生在当前的Application实例(即运行宏的地方,在本例中为您打开的Access Application)中。要进行更改,我们需要给它正确的应用程序来触发此命令。

我已经对您的代码进行了一些调整,以使您知道该怎么做。不知道您是否需要工作区功能,或者只是在Web上找到的功能,而是打开一个新的Access实例,一次加载一个数据库,然后将表格导出到Access Application的那个实例中。 / p>

Sub batchExportTables2XLS()
    Dim table As DAO.TableDef, database As DAO.database
    Dim file As String, filePath As String, outFile As String
    Dim appAccess As New Access.Application


    filePath = CurrentProject.Path
    file = Dir(filePath & "\*.mdb")



    Do Until file = ""
        appAccess.OpenCurrentDatabase filePath & "\" & file


        'Export all tables to outFile
        outFile = filePath & "\" & Left(file, Len(file) - 4) & ".xls"
        For Each table In appAccess.CurrentDb.TableDefs
            If Left(table.Name, 4) = "MSys" Then
                'Do nothing -- Skip system tables
            Else
                appAccess.DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, table.Name, outFile, True, Replace(table.Name, "dbo_", "")

            End If
        Next
        appAccess.CloseCurrentDatabase

        file = Dir()
    Loop
    Set appAccess = Nothing
End Sub