我已经在线研究了几周的代码,但仍然找不到我需要的内容,所以任何帮助都将不胜感激:
我需要:
1)导入“C:\ Documents”中的第一个CSV,并创建一个名为“Data”的表,其中包含我已创建的导入规范。
2)创建一个(SELECT?)查询(Sport = Football,Event = Match Odds)中的所有字段并将其导出到名为“Match Odds 001”的excel二进制文件中 然后,我希望从表“数据”中删除此查询中包含的数据。
3)重复步骤2)两百次,使用不同的事件将每个查询导出到名为“(Event)001”的excel二进制文件,然后从表中删除该查询数据。
4)所有查询运行并被删除后,表中的任何剩余数据将被导出到名为“Misc 001”的excel二进制文件中,然后从表“数据”中删除此数据(或者甚至删除表“数据”完全。)
5)重复1)从“C:\ Documents”导入第二个CSV文件,并将查询导出到名为“(Event)002”的Excel二进制文件,以免替换以前的文件。
这将一直持续到导入并拆分所有CSV为止。
由于有200个查询,我更愿意在VBA代码中创建它们。
我刚开始在Access中使用VBA,到目前为止已找到将导入文件夹中所有csv文件的代码,所以我希望插入代码来创建,导出然后删除查询。
非常感谢任何有关vba编码的帮助。
更新:非常感谢Mike,我现在有了以下代码,但是出现了一些小问题。
1)在“DoCmd.RunSQL”DROP TABLE数据“”命令之后,如何压缩数据库以减少文件大小? 我希望重复导入500MB CSV然后删除它们,所以在我导入并删除第一个然后导入第二个文件大小变为1GB并且正在增加。
2)在事件表中包含第二列是多么困难,以便我的SELECT查询变为WHERE Event = Event&选择=选择并组合这两个字段以创建文件名?
3)用于创建查询和文件名的事件表有时包含不能在文件名中使用的字符,例如“/”& “?”。是否可以轻松删除这些以创建文件名,或者最好在事件表中添加另一列,其中包含要使用的文件名(即事件和选择的组合,但删除了不允许的字符)
如果我能解决这些问题,我将获得完美的代码以满足我的需求,再次归功于迈克。
Sub ImportAndSplit()
Dim fileCounter As String
Dim rs As New ADODB.Recordset
Dim sql As String
Dim qdf As QueryDef
Dim file As String
Const strPath As String = "C:\Users\Robbie\Documents\Data\" 'Directory Path
Dim strFile As String 'Filename
Dim strFileList() As String 'File Array
Dim intFile As Integer 'File Number
strFile = Dir(strPath & "*.csv") 'Loop through the folder & build file list
While strFile <> ""
intFile = intFile + 1 'add files to the list
ReDim Preserve strFileList(1 To intFile)
strFileList(intFile) = strFile
strFile = Dir()
Wend
If intFile = 0 Then 'see if any files were found
MsgBox "No files found"
Exit Sub
End If
DoCmd.SetWarnings False
Set qdf = CurrentDb.QueryDefs("Export")
sql = "SELECT Event FROM Events"
rs.Open sql, CurrentProject.Connection, adOpenStatic, adLockReadOnly
For intFile = 1 To UBound(strFileList) 'cycle through the list of files & import to Access creating a new table called Data
DoCmd.TransferText acImportDelim, "Data", "Data", strPath & strFileList(intFile)
fileCounter = Format(intFile, "000") 'format i so that when you use it in file names, the files sort intuitively
Do While Not rs.EOF
sql = "SELECT * FROM Data WHERE Event='" & rs!Event & "'" 'select the records to export and export them
file = "C:\Users\Robbie\Documents\Data Split\" & rs!Event & " " & fileCounter & ".xlsb" 'use the counter to distinguish between which csv your exporting from
qdf.sql = sql
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, qdf.Name, file
sql = "DELETE FROM Data WHERE Event='" & rs!Event & "'" 'delete the records from the source table
DoCmd.RunSQL sql
rs.MoveNext
Loop
rs.MoveFirst
'export remaining data
file = "C:\Users\Robbie\Documents\Data Split\Misc " & fileCounter & ".xlsb" 'use the counter to distinguish between which csv your exporting from
sql = "SELECT * FROM Data"
qdf.sql = sql
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, qdf.Name, file
'delete remaining data
'DoCmd.RunSQL "DELETE FROM Data"
'or delete the table
DoCmd.RunSQL "DROP TABLE Data"
Next
MsgBox UBound(strFileList) & " Files were Imported and Split"
rs.Close
DoCmd.SetWarnings True
End Sub
答案 0 :(得分:0)
创建一个包含事件的表格(在我的示例中称为“事件”,并且有一个字段“事件”)。
创建一个名为“Export”的查询。无论它做什么,我们都要覆盖它200次。
添加ActiveX数据对象库参考
代码:
Dim i As Integer
Dim fileCounter As String
Dim rs As New ADODB.Recordset
Dim sql As String
Dim qdf As QueryDef
Dim file As String
DoCmd.SetWarnings False
Set qdf = CurrentDb.QueryDefs("Export")
sql = "SELECT Event FROM Events"
rs.Open sql, CurrentProject.Connection, adOpenStatic, adLockReadOnly
For i = 1 To x 'where x is however many csvs you're importing
fileCounter = Format(i, "000") 'format i so that when you use it in file names, the files sort intuitively
'run your import code here
Do While Not rs.EOF
'select the records to export and export them
sql = "SELECT * FROM Data WHERE Event='" & rs!Event & "'"
file = "C:\Documents\" & rs!Event & fileCounter & ".xlsb" 'use the counter to distinguish between which csv your exporting from
qdf.sql = sql
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, qdf.Name, file
'delete the records from the source table
sql = "DELETE FROM Data WHERE Event='" & rs!Event & "'"
DoCmd.RunSQL sql
rs.MoveNext
Loop
rs.MoveFirst
'export remaining data
file = "C:\Documents\MISC" & fileCounter & ".xlsb" 'use the counter to distinguish between which csv your exporting from
sql = "SELECT * FROM Data"
qdf.sql = sql
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, qdf.Name, file
'delete remaining data
DoCmd.RunSQL "DELETE FROM Data"
'or delete the table
'DoCmd.RunSQL "DROP TABLE Data"
Next i
rs.Close
DoCmd.SetWarnings True
在运行此文件之前确保这些文件都不存在,它不会覆盖文件。可以手动删除它们,也可以在循环中使用Windows脚本主机删除文件(如果它们存在),然后再创建它们......
Dim fso As New FileSystemObject
If fso.FileExists(file) Then
fso.DeleteFile (file)
End If
回应您的更新:
考虑关联它们而不是导入(DoCmd.TransferText acLink, "Data"...
)。我不相信你在数据库中工作时可能会紧凑,它必须关闭。
你基本上回答了自己的问题。如果您想这样做,请将该列添加到表中,并按照您的说法完全更新SQL。
你可以使用Replace function,但你必须为每个非法角色运行它,你可能最终错过了一个。最好按照你的建议去做,然后在新专栏中自己创建。