使用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
- 他们可能不总是相同的 - ...
但这还不是这个问题的一部分。毕竟,所有你想知道的是:
是否有无论如何不覆盖已经导入的数据?
我希望我能够充分回答这个问题。
是的,我明白这是需要发生的,但问题是,我不知道如何实现它。我会假设需要有某种循环,但是再一次,我的第二天使用VBA。 – Spnkmyr
如果您扩展程序以将'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
嘿,谢谢你的帮助。在你的例子中,你能详细说明实现这个过程所需要的步骤(特别是load_csv(rng作为范围)吗?你可以声明Worksheet.Range = rng然后调用rng(“$ B $ 1”)或类似的东西吗?这与数据导入的位置有关,我基本上希望每个数据集都要加载到最后一个数据集(而不是相同的单元格,这会将所有先前的数据横向推送)如果您说Destination:= rng,那么您如何指定初始值范围,然后是后续的进口范围? – Spnkmyr