使用VBA将.csv中的数据导入到excel文档中

想知道如果你能帮助一个VBA问题。 我把下面的东西拼凑在一起,却不知道自己在做什么:

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中打开一个文件对话框,允许用户select一个文件,然后打开它。

我想要做的是以下几点:

1)打开一个文件对话框,并select一个.csv文件,将数据从(完整的?)导入.xlsm主文件(包含多个工作表)。

2)从.csv中select某些列(在这种情况下,列A,Q,R和S),复制它们并将它们导入到名为“原始条带数据”的主excel文件的第二个表格中。

任何帮助在这个问题将不胜感激。

更新:我设法find以下代码:

 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 

还有很大的改进空间:

  • 删除重复的标题
  • 创build一个循环,而不是显式调用load_csv四次
  • 更好地控制用户select文件(多选)
  • 即使在导入之后,从QueryTable断开导入的数据以减less依赖关系
  • 不在ThisWorkbook导入,但之后保存ActiveWorkbook – 它们可能并不总是相同的

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

反正有没有覆盖已经导入的数据?

我希望我可以用上面的方法来回答这个问题。