外部程序正在不断生成小的.mdb数据库文件。数据库表中的数据必须加载到STATA中进行数据处理。
到目前为止,我创建的工作流程是:
我可以一次为一个文件执行此操作,但是我希望一次运行最多100个.mbd文件的文件夹中执行此操作。
(这个问题尤其与第1步有关,但是我将其余内容作为上下文添加。如果您有更好或更直接的途径来完成主要任务,请在评论中告诉我)。
以下是我用来为单个文件创建.xls的VBA宏(此答案的代码的修改版本:https://stackoverflow.com/a/13248627/1685346):
// Throws a ReferenceError that `object_name` is not defined.
(function() {})(object_name.property_name = 2)
使用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中的表相对应的工作表。我觉得这非常接近,但是如何获取代码以产生正确的输出呢?
答案 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