使用VBA将数据从.csv导入excel文档

问题描述:

想知道您是否可以帮助解决VBA问题。我拼凑不真正知道我在做什么如下:使用VBA将数据从.csv导入excel文档

Sub Import_Raw_Stripe_data() 

    Dim fileDialog As fileDialog 
    Dim strPathFile As String 
    Dim strFileName As String 
    Dim strPath As String 
    Dim dialogTitle As String 
    Dim Tworkbook As Workbook 
    Dim Sworkbook As Workbook 


dialogueTitle = "Select File to Import" 
Set fileDialogue = Application.fileDialog(msoFileDialogFilePicker) 
With fileDialogue 
    .InitialFileName = "L:\Downloads" 
    .AllowMultiSelect = False 
    .Filters.Clear 
    .Title = dialogueTitle 

    If .Show = False Then 
     MsgBox "No file selected." 
     Exit Sub 
    End If 
    strPathFile = .SelectedItems(1) 
End With 

Set Sworkbook = Workbooks.Open(fileName:=strPathFile) 
Set Tworkbook = ThisWorkbook 



End Sub 

其中,据我可以告诉打开Excel中的一个文件对话框,允许用户选择一个文件,然后打开它。

我想这样做的是以下几点:

1)打开文件对话框,选择一个.csv文件导入从(完成)成.XLSM主文件(多表)?

2)从.csv中选择某些列(在这种情况下,列A,Q,R和S),复制它们并将它们导入名为“Raw Stripe Data”的主excel文件的第二个表格中。

任何有关此事的帮助将不胜感激。

更新:我设法找到下面的代码:

Sub load_csv() 
    Dim fStr As String 

    With Application.fileDialog(msoFileDialogFilePicker) 
     .Show 
     If .SelectedItems.Count = 0 Then 
      MsgBox "Cancel Selected" 
      Exit Sub 
     End If 
     'fStr is the file path and name of the file you selected. 
     fStr = .SelectedItems(1) 
    End With 

    With ThisWorkbook.Sheets("Stripe Raw Data").QueryTables.Add(Connection:= _ 
    "TEXT;" & fStr, Destination:=ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1")) 
     .Name = "CAPTURE" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
     ActiveWorkbook.Save 



    End With 

End Sub 

这个伟大的工程 - 但反正是有有它不会覆盖已经导入的数据? (例如,如果我使用它两次,第二次导入覆盖第一次)。

ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1")指定将导入的数据写入的位置,即表单的第一个单元格Stripe Raw Data

如果您希望在下一个位置导入下一个导入,请根据自己的喜好调整它。

正如评论中所述,您可以更改load_csv()以将输出目标作为参数。如果您也从Sub改为Function,可以返回导入的行数:

Function load_csv(rngDestination As Range) As Long 
    '... 

    With ThisWorkbook.Sheets("Stripe Raw Data").QueryTables.Add(Connection:= _ 
    "TEXT;" & fStr, Destination:=rng) 

     '... 

     .Refresh BackgroundQuery:=False 
     load_csv = .ResultRange.Rows.Count 

     '... 

End Function 

现在可以反复调用load_csv,并向其提供在输出应该开始例如范围:

Dim rngOutput As Range 
Dim lngRows As Long 

Set rngOutput = ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1") 

lngRows = load_csv(rngOutput) ' load first file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load second file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load third file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load fourth file 

还有很大的改进空间:

  • 删除重复标题
  • 创建一个循环,而不是显式调用load_csv四次
  • 更好地控制用户选择文件(多选)
  • 断开了的QueryTable导入的数据甚至进口
  • ThisWorkbook不汇入后,以减少依赖但事后节约ActiveWorkbook - 他们可能不总是相同的
  • ...

但这还不是这个问题的一部分。毕竟,所有你想知道的是:

是否有无论如何不覆盖已经导入的数据?

我希望我能够充分回答这个问题。

+0

是的,我明白这是需要发生的,但问题是,我不知道如何实现它。我会假设需要有某种循环,但是再一次,我的第二天使用VBA。 – Spnkmyr

+0

如果您扩展程序以将'ThisWorkbook.Sheets(“Stripe Raw Data”)。Range(“$ A $ 1”)'作为参数如下:'load_csv(rng As Range)' - 那么您可以更改导入对于这个:ThisWorkbook.Sheets(“Stripe Raw Data”)。QueryTables.Add(Connection:= _ “TEXT;”&fStr,Destination:= rng)' - 现在您可以反复调用'load_csv()'参数。 – Leviathan

+0

嘿,谢谢你的帮助。在你的例子中,你能详细说明实现这个过程所需要的步骤(特别是load_csv(rng作为范围)吗?你可以声明Worksheet.Range = rng然后调用rng(“$ B $ 1”)或类似的东西吗?这与数据导入的位置有关,我基本上希望每个数据集都要加载到最后一个数据集(而不是相同的单元格,这会将所有先前的数据横向推送)如果您说Destination:= rng,那么您如何指定初始值范围,然后是后续的进口范围? – Spnkmyr