2013-12-19 50 views
1

我已经研究了这个网上数周的代码,但仍无法找到我所需要的,因此任何帮助,将不胜感激:导入CSV,出口查询,删除查询然后重复

我需要:

1)导入“C:\ Documents”中的第一个CSV,并创建一个名为“Data”的表格,其中包含我已经创建的导入规格。

2)在(SELECT?)查询(体育=足球,事件=匹配赔率)中创建和导出一个名为“Match Odds 001”的excel二进制文件 然后我希望删除包含在查询表“数据”。

3)重复步骤2)具有不同的活动导出每个查询,以名称为“(事件)001”,则删除从表中查询数据的Excel二进制文件200倍。

4)所有查询运行并被删除后,表中的任何剩余数据将被导出到一个名为“Misc 001”的excel二进制文件,然后从表“数据”中删除该数据(或者甚至删除)

5)重复1)从“C:\ Documents”导入第二个CSV文件,并将查询导出到Excel名为“(Event)002”的二进制文件,以便不替换以前的文件。

这将继续下去,直到所有的CSV已导入和分裂。

由于有200个查询我宁愿在VBA代码来创建它们。

我刚开始在Access中使用VBA,迄今已发现代码将导入所有CSV文件的文件夹中,所以我希望能插入代码来创建,导出然后删除查询。

对vba编码所需的任何帮助都非常感谢。

UPDATE:随着大量的感谢迈克现在我有以下的代码,但一些小问题也浮出水面。

1)如何可以压缩数据库,以减少文件大小的“DoCmd.RunSQL‘DROP TABLE数据’”命令后? 我想重复导入500MB的CSV然后删除它们,所以在我导入并放下第一个然后导入第二个文件大小变成1GB并且正在增加。

2)在事件表中包含第二列以便我的SELECT查询成为WHERE事件=事件& Selection = Selection并将这两个字段组合起来以创建文件名?

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
  1. 与它的活动创建一个表(在我的例子,它被称为“事件”,有一个领域的“事件”)。

  2. 创建一个名为“导出”的查询。无论它做什么,我们都会覆盖它200次。

  3. 添加ActiveX数据对象库参考

  4. 代码:

    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 

在回答您的更新:

  1. 考虑链接他们而不是进口(DoCmd.TransferText acLink, "Data"...)。我不相信在db中工作时可能会紧凑,但它不得不关闭。

  2. 你基本上回答了你自己的问题。如果您想这样做,请将该列添加到表中并按照您的说法更新SQL。

  3. 您可以使用Replace function,但是您必须为每个非法字符运行它,并且最终可能会丢失一个。这可能是最好的做你所建议的,只是在一个新的专栏中自己创建它们。

+0

非常感谢你的帮助。我没有想过自动化查询创建,并且放弃了单独写出所有200个查询。我会尽快实施这个解决方案。再次感谢。 – user3119454

+0

很高兴为您提供帮助。如果结果正确,请接受答案。 – Mike

+0

我已经修改了代码,它运行良好,但2个问题已浮出水面,我还有一个问题。感谢您的帮助,如果您能再次得到帮助,请再次感谢。我已经更新了这个问题以反映当前的情况。 – user3119454