【问题标题】:Importing data from .csv to excel document using VBA使用 VBA 将数据从 .csv 导入 excel 文档
【发布时间】:2017-07-07 19:07:51
【问题描述】:

想知道您是否可以帮助解决 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

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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

    如果您想在另一个位置进行下一次导入,请根据自己的喜好调整。

    如 cmets 中所述,您可以更改 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 的第二天。
    • 如果您扩展过程以将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()变化的参数。
    • 您好,感谢您的帮助。在您的示例中,您能否详细说明实现此操作所需的步骤(特别是 load_csv(rng As Range)?您可以声明 Worksheet.Range = rng 然后调用 rng("$B$1") 或类似的东西吗?另一个问题我had与数据的导入位置有关。我基本上希望每个数据集加载到最后一个之上(而不是横向推送所有先前数据的同一个单元格)。如果你说Destination:= rng,你如何指定初始范围,然后是后续的导入范围?
    • 是的,这太棒了,感谢您的澄清和耐心!
    • 太好了,很高兴我能帮上忙!在这种情况下,您应该通过单击投票按钮下方的复选标记来对此答案进行投票并将其标记为已接受的答案。这将奖励我们双方的声望点。对于您个人资料中列出的以前的问题,您可能也应该这样做:stackoverflow.com/users/5308865/spnkmyr
    猜你喜欢
    • 2016-06-08
    • 2015-02-23
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多