我需要链接到大约270(金额可以更改).txt文件并在所有这些文件上创建一个选择查询。我可以立即导入它们没有问题,但是因为Access每个选择查询只能处理32个表我需要一些方法来创建一个变量(动态?),它将保存一个SQL字符串,然后将其用作参数创建查询def函数。有没有人有任何想法。我认为我需要使用课程,但有更简单的方法吗?
答案 0 :(得分:0)
我在类似情况下的方法是将所有输入文件放在一个公共文件夹中,该文件夹中没有其他内容。然后我使用以下vba脚本来处理所有文件。对于每个文件,我将文件名添加到目录表(“.import files”),将数据添加到第二个表(“.import data”)。数据中的“源”字段是指向文件列表“索引”字段的链接,因此我知道哪些数据来自每个源文件。文件夹中有多少文件无关紧要。 (如果你愿意,你可以改变这两个表中的一个,这样如果我一直在考虑更多这两个字段具有相同的名称,我会这样做。)
我的输入文件格式不是很好(我无法控制数据源),但至少它们都是相同的格式不佳。具体而言,数据的第一行中没有字段名称。这就是我将它们导入临时文件的原因,而在“insert into”命令中,源表中的字段如F1,... F9。您需要更改构建SQL“插入到”语句的行以匹配您的文件格式。
您还需要在运行代码之前创建目录和数据文件 - 您可以通过将其中一个源文件导入为模板来创建数据文件,然后对其进行编辑以添加“源”字段。 “.import files”表中的3个字段是Index(这是一个自动编号字段),文件名和更新日期。
完成此操作后,您将有两个表可以加入“source”(来自.import数据)和“index”(来自.import文件)。然后,您可以继续进行所需的任何处理。您可以选择“源”来查看特定的输入文件,或按“源”分组以按输入汇总数据,或者忽略“源”以获取所有数据的摘要。
Function Import_BTT()
'On Error Resume Next
DoCmd.SetWarnings False
'Get folder & file list
Source_folder = Get_Folder()
Set fso = CreateObject("Scripting.FileSystemObject")
Set flist = fso.GetFolder(Source_folder).Files
'delete prior data
Set DB = CurrentDb()
DB.Execute ("delete * from [book to tax import files];")
DB.Execute ("delete * from [book to tax import data];")
'Process each file
For Each file In flist
If (Len(Dir(Source_folder & "\" & file.Name)) = 0) Then GoTo NextFile
'add new data
DB.Execute "insert into [Book to Tax import files] ([file name],[update date]) values (" & "'" & file.Name & "',#" & file.DateLastModified & "#);"
Source = DB.OpenRecordset("SELECT @@IDENTITY")(0)
DoCmd.TransferText , , "Book to Tax import Temp", Source_folder & "\" & file.Name
SQL = "INSERT INTO [Book to Tax Import data] (source, Account, [Book Balance], [Book Adjustments], [Adjusted Book Balance], [Tax Reclass], [Balance After Tax Reclass], [Tax Adjustments], [Historical tax Adjustments], [Tax Balance] )"
SQL = SQL & "select '" & Source & "',mid(F1,instr(f1,'(')+1,10),F2,F3,F4,F5,F6,F7,F8,F9 FROM [Book to Tax import temp] where ((trim(f1) like 'BK (*') or (trim(f1) like 'TAX (*'));"
DoCmd.RunSQL SQL
DoCmd.DeleteObject acTable, "Book to Tax Import Temp"
NextFile: Next file
MsgBox ("data import completed")
DoCmd.SetWarnings True
End Function
Public Function Get_Folder()
'Create a FileDialog object as a Folder Picker dialog box.
Const msoFileDialogFolderPicker = 4
Const msoFileDialogFilePicker = 3
Const msoFileDialogViewDetails = 2
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.AllowMultiSelect = False
fd.ButtonName = "Select"
fd.InitialView = msoFileDialogViewDetails
fd.Title = "Select Folder"
fd.InitialFileName = "MyDocuments\"
fd.Filters.Clear
'Show the dialog box and get the file name
If fd.Show = -1 Then
Get_Folder = fd.SelectedItems(1)
Else
Get_Folder = "MyDocuments\"
End If
Set fd = Nothing
End Function