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

时间:2017-02-18 06:11:44

标签: excel vba

想知道你是否可以帮助解决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中打开一个文件对话框,允许用户选择一个文档,然后打开它。

我想做的是以下内容:

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

这很好用 - 但是有没有它不会覆盖已导入的数据? (例如,如果我使用它两次,第二次导入会覆盖第一次)。

1 个答案:

答案 0 :(得分:2)

grey frame指定导入数据的写入位置,即表单 Stripe Raw Data 的第一个单元格。

如果您希望在其他位置进行下一次导入,请根据自己的喜好进行调整。

如评论中所述,您可以更改ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1")以将输出目标作为参数。如果您还将其从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 四次
  • 更好地控制用户选择文件(多选)
  • 断开导入数据与QueryTable的连接,以便在导入后减少依赖性
  • 未导入load_csv但之后保存ThisWorkbook - 它们可能并非总是相同
  • ...

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

  

无论如何都没有覆盖已导入的数据?

我希望我能用上面的内容充分回答这个问题。