【问题标题】:Combine and Append data from multiple Excel workbooks into one worksheet将多个 Excel 工作簿中的数据合并并附加到一个工作表中
【发布时间】:2017-12-09 21:15:16
【问题描述】:

我在下面找到了一个在线 VBA 脚本,它从一个目录中的工作簿中获取所有工作表,并将它们全部合并到一个工作簿中作为单独的工作表。但是,我不希望它们成为单独的工作表。我希望工作表中的所有数据都在一个工作表中。

Sub GetSheets()
    Path = "Desktop\RandoDir"
    Filename = Dir(Path & "\*.csv*")
    Do While Filename <> ""
        Workbooks.Open Filename:=Path & Filename, ReadOnly:=True
        For Each Sheet In ActiveWorkbook.Sheets
            'MsgBox Filename      ---Debugging
            Sheet.Copy After:=ThisWorkbook.Sheets(1)
        Next Sheet
        Workbooks(Filename).Close
        Filename = Dir()
   Loop
End Sub

如果我在两个文件中有这样的数据结构:

   **File1**                **File2**
Header1|Header2    |     Header1|Header2
Tim    |Smith      |     Mike   |Jones

我希望显示合并的工作表

   **File3**
Header1|Header2
Tim    |Smith
Mike   |Jones

【问题讨论】:

  • 您要复制多少列(它只有会是 A 和 B)吗?另外,这些电子表格是否相互一致?

标签: excel vba


【解决方案1】:

如果不需要 VBA,您可以在包含 CSV 的文件夹中使用 DOS 命令

mergeCSVs.bat(在 CSV 文件夹中):

copy *.csv all.csv

echo Header1,Header2 > result.csv

type all.csv | findstr /v Header1,Header2 >> result.csv

del all.csv

  • copy *.csv all.csv - 将所有 CSV 合并到一个新文件中 all.csv(带有重复的标题)
  • echo Header1,Header2 &gt; result.csv - 创建一个新的result.csv 并写入第一行
  • type all.csv | findstr /v Header1,Header2 &gt;&gt; result.csv
    • type all.csv - 从all.csv 中提取所有数据
    • findstr /v Header1,Header2 - 过滤掉 all.csv 中的所有标题行
    • &gt;&gt; result.csv - 将所有这些数据附加到 result.csv
  • del all.csv - 删除临时文件 all.csv

results.csv 将包含合并的数据

csv1.csv:

Header1,Header2
Tim,Smith

csv2.csv:

Header1,Header2
Mike,Jones

结果.csv:

Header1,Header2 
Tim,Smith
Mike,Jones

注意事项:

  • 两个 csv 文件的末尾都包含一个空行
  • 它们以逗号分隔(不像您的示例中那样以管道分隔)

【讨论】:

    【解决方案2】:

    这会做你想做的。

    Sub Basic_Example_1()
        Dim MyPath As String, FilesInPath As String
        Dim MyFiles() As String
        Dim SourceRcount As Long, Fnum As Long
        Dim mybook As Workbook, BaseWks As Worksheet
        Dim sourceRange As Range, destrange As Range
        Dim rnum As Long, CalcMode As Long
    
        'Fill in the path\folder where the files are
        MyPath = "C:\Users\Ron\test"
    
        'Add a slash at the end if the user forget it
        If Right(MyPath, 1) <> "\" Then
            MyPath = MyPath & "\"
        End If
    
        'If there are no Excel files in the folder exit the sub
        FilesInPath = Dir(MyPath & "*.xl*")
        If FilesInPath = "" Then
            MsgBox "No files found"
            Exit Sub
        End If
    
        'Fill the array(myFiles)with the list of Excel files in the folder
        Fnum = 0
        Do While FilesInPath <> ""
            Fnum = Fnum + 1
            ReDim Preserve MyFiles(1 To Fnum)
            MyFiles(Fnum) = FilesInPath
            FilesInPath = Dir()
        Loop
    
        'Change ScreenUpdating, Calculation and EnableEvents
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        'Add a new workbook with one sheet
        Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
        rnum = 1
    
        'Loop through all files in the array(myFiles)
        If Fnum > 0 Then
            For Fnum = LBound(MyFiles) To UBound(MyFiles)
                Set mybook = Nothing
                On Error Resume Next
                Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum))
                On Error GoTo 0
    
                If Not mybook Is Nothing Then
    
                    On Error Resume Next
    
                    With mybook.Worksheets(1)
                        Set sourceRange = .Range("A1:C1")
                    End With
    
                    If Err.Number > 0 Then
                        Err.Clear
                        Set sourceRange = Nothing
                    Else
                        'if SourceRange use all columns then skip this file
                        If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
                            Set sourceRange = Nothing
                        End If
                    End If
                    On Error GoTo 0
    
                    If Not sourceRange Is Nothing Then
    
                        SourceRcount = sourceRange.Rows.Count
    
                        If rnum + SourceRcount >= BaseWks.Rows.Count Then
                            MsgBox "Sorry there are not enough rows in the sheet"
                            BaseWks.Columns.AutoFit
                            mybook.Close savechanges:=False
                            GoTo ExitTheSub
                        Else
    
                            'Copy the file name in column A
                            With sourceRange
                                BaseWks.cells(rnum, "A"). _
                                        Resize(.Rows.Count).Value = MyFiles(Fnum)
                            End With
    
                            'Set the destrange
                            Set destrange = BaseWks.Range("B" & rnum)
    
                            'we copy the values from the sourceRange to the destrange
                            With sourceRange
                                Set destrange = destrange. _
                                                Resize(.Rows.Count, .Columns.Count)
                            End With
                            destrange.Value = sourceRange.Value
    
                            rnum = rnum + SourceRcount
                        End If
                    End If
                    mybook.Close savechanges:=False
                End If
    
            Next Fnum
            BaseWks.Columns.AutoFit
        End If
    
    ExitTheSub:
        'Restore ScreenUpdating, Calculation and EnableEvents
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    

    您可以在此处找到更多信息。

    https://www.rondebruin.nl/win/s3/win008.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 2020-06-03
      • 2019-08-25
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多