【问题标题】:importing multiple csv files into existing worksheets将多个 csv 文件导入现有工作表
【发布时间】:2019-07-25 04:58:16
【问题描述】:

我正在尝试将文件夹中的多个 CSV 文件导入现有工作簿。在此工作簿中,我需要将 CSV 文件导入并覆盖与 CSV 文件名相同的现有工作表。我需要覆盖工作表,因为我有引用它们的公式。我有以下内容,但它会在新工作簿中创建新工作表。我是 excel 新手,希望您能提供任何帮助。我正在使用 Excel 2019。谢谢。

Sub CombineTextFiles()
    Dim FilesToOpen
    Dim x As Integer
    Dim wkbAll As Workbook
    Dim wkbTemp As Workbook
    Dim sDelimiter As String

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    sDelimiter = "|"

    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Text Files (*.csv), *.csv", _
      MultiSelect:=True, Title:="Text Files to Open")

    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "No Files were selected"
        GoTo ExitHandler
    End If

    x = 1
    Set wkbTemp = Workbooks.Open(Filename:=FilesToOpen(x))
    wkbTemp.Sheets(1).Copy
    Set wkbAll = ActiveWorkbook
    wkbTemp.Close (False)
    wkbAll.Worksheets(x).Columns("A:A").TextToColumns _
      Destination:=Range("A1"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, _
      ConsecutiveDelimiter:=False, _
      Tab:=False, Semicolon:=False, _
      Comma:=False, Space:=False, _
      Other:=True, OtherChar:="|"
    x = x + 1

    While x <= UBound(FilesToOpen)
        Set wkbTemp = Workbooks.Open(Filename:=FilesToOpen(x))
        With wkbAll
            wkbTemp.Sheets(1).Move After:=.Sheets(.Sheets.Count)
            .Worksheets(x).Columns("A:A").TextToColumns _
              Destination:=Range("A1"), DataType:=xlDelimited, _
              TextQualifier:=xlDoubleQuote, _
              ConsecutiveDelimiter:=False, _
              Tab:=False, Semicolon:=False, _
              Comma:=False, Space:=False, _
              Other:=True, OtherChar:=sDelimiter
        End With
        x = x + 1
    Wend

ExitHandler:
    Application.ScreenUpdating = True
    Set wkbAll = Nothing
    Set wkbTemp = Nothing
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    这对我有用。我更喜欢Excel.QueryTables

    Sub CombineTextFiles()
        Dim fso As Object
        Dim xlsheet As Worksheet
        Dim qt As QueryTable
        Dim txtfilesToOpen As Variant, txtfile As Variant
    
        Application.ScreenUpdating = False
        Set fso = CreateObject("Scripting.FileSystemObject")
    
        txtfilesToOpen = Application.GetOpenFilename _
                     (FileFilter:="Text Files (*.csv), *.csv", _
                      MultiSelect:=True, Title:="Text Files to Open")
    
        For Each txtfile In txtfilesToOpen
            ' FINDS EXISTING WORKSHEET
            For Each xlsheet In ThisWorkbook.Worksheets
                If xlsheet.Name = Replace(fso.GetFileName(txtfile), ".csv", "") Then
                    xlsheet.Activate
                    GoTo ImportCSV
                End If
            Next xlsheet
    
            ' CREATES NEW WORKSHEET IF NOT FOUND
            Set xlsheet = ThisWorkbook.Worksheets.Add( _
                                 After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            xlsheet.Name = Replace(fso.GetFileName(txtfile), ".csv", "")
            xlsheet.Activate
            GoTo ImportCSV
    
    ImportCSV:
            ' DELETE EXISTING DATA
            ActiveSheet.Range("A:Z").EntireColumn.Delete xlShiftToLeft
    
            ' IMPORT DATA FROM TEXT FILE
            With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & txtfile, _
              Destination:=ActiveSheet.Cells(1, 1))
                .TextFileParseType = xlDelimited
                .TextFileConsecutiveDelimiter = False
                .TextFileTabDelimiter = False
                .TextFileSemicolonDelimiter = False
                .TextFileCommaDelimiter = False
                .TextFileSpaceDelimiter = False
                .TextFileOtherDelimiter = "|"
    
                .Refresh BackgroundQuery:=False
            End With
    
            For Each qt In ActiveSheet.QueryTables
                qt.Delete
            Next qt
        Next txtfile
    
        Application.ScreenUpdating = True
        MsgBox "Successfully imported text files!", vbInformation, "SUCCESSFUL IMPORT"
    
        Set fso = Nothing
    End Sub
    

    【讨论】:

    • @JakeHoward 很高兴它对你有用。请接受我的回答。要将答案标记为已接受,请点击下方答案旁边的复选标记,将其从灰色切换为已填充。谢谢
    • 谢谢。这对我来说只是一个小小的改变。该代码删除了破坏我的一些链接公式的单元格。我添加了这一行来清除整个工作表。我感谢您的帮助。 Sheets("Sheet4").Cells.ClearContents
    • 这很好用,但现有工作表必须包含 .csv 扩展名,或者创建一个带有 .csv 扩展名的新工作表。如何更改此代码以仅引用不带扩展名的文件名?
    • @JakeHoward 在我的示例测试中,我没有遇到这个问题。文件检查了没有 csv 扩展名的工作表,并创建了没有 csv 扩展名的其他工作表。让我再次探索。请给我一些时间。
    • @JakeHoward 请查看上传到 imgur imgur.com/sSzmLhF> 的快照。右侧的示例目录包含 .csv 以外的文件,但左侧的文件对话框不允许选择 .csv 以外的文件。所以你所说的问题不应该给麻烦..它在我的最后工作正常。我在以前的 cmets 中得到了纠正 仅选择了带有 .csv 扩展名的文件并创建了没有 csv 扩展名的工作表。对不起,我最后做了很多事情,以至于这条线出错了。
    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多