使用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
– 它们可能并不总是相同的 - …
但这不是这个问题的一部分。 毕竟,你想知道的是:
反正有没有覆盖已经导入的数据?
我希望我可以用上面的方法来回答这个问题。