phpdragon

前提: 每个表格的数据格式一致,包含有表头,红色字体部分按情况自行修改。

 

Sub 合并()

    If MsgBox("是否要汇总明细表?", vbYesNo + vbInformation) = vbNo Then   \'提示是否汇总
        Exit Sub
    End If
    
    
    On Error Resume Next \'如遇错误继续运行

    Application.ScreenUpdating = False \'关闭屏幕刷新

    Application.DisplayAlerts = False \'禁用警告提示


    
    Dim ws As Worksheet
    
    Dim i%, fileNum%, deletRow%, sheetsSum%
    Dim sheetNum, sheetName, sheetNameArray
    
    Dim sheetRowTotalArray() As Integer \'定义一个动态数组,用于判断合并表格是否成功
    
    sheetNameArray = Array("工作簿1", "工作簿2") \'定义工作簿
    
    sheetsSum = UBound(sheetNameArray) - LBound(sheetNameArray) + 1 \'计算工作簿总个数
    
    ReDim sheetRowTotalArray(sheetsSum) \'定义数组长度
    



    
    \'遍历新增工作簿
    
    sheetNum = 1

    For Each sheetName In sheetNameArray
       ThisWorkbook.Sheets.Add Before:=Worksheets(Worksheets.Count) \'新增工作簿
       ThisWorkbook.Sheets(sheetNum).Name = sheetName \'重命名工作簿
       
       sheetRowTotalArray(sheetNum) = 0 \'初始化每一个汇总工作簿的总行数
       
       sheetNum = sheetNum + 1
    Next sheetName
    
    
    
    
    
    
    Dim path, fileName  \'定义路径名,被合并表名称

    Dim sourceWb As Workbook

    path = ThisWorkbook.path \'指定路径为合并新表所在路径

    fileName = Dir(path & "\" & "*文件后缀.xlsx") \'从该文件夹内遍历所有要合并的表格
    
    
    
    fileNum = 0 \'初始化当前是打开了第几个表格文件
    

    Do While fileName <> ""  \'遍历的表格名不为空就进入循环

        
        Set sourceWb = Workbooks.Open(path & "\" & fileName) \'打开遍历到的表格

        
        sheetNum = 1 \'初始化工作簿索引
        For Each sheetName In sheetNameArray
        
            If sourceWb.Sheets(sheetName).AutoFilterMode Then
                sourceWb.Sheets(sheetName).AutoFilterMode = False \'去除筛选模式
            End If
        
        
            i = ThisWorkbook.Sheets(sheetName).Range("A" & Rows.Count).End(xlUp).Row + 1 \'获取汇总表中A列数据区域最后一行的行号
            
            sourceWb.Sheets(sheetName).UsedRange.Copy \'复制分表中的数据
    
            ThisWorkbook.Sheets(sheetName).Cells(i, 1).PasteSpecial Paste:=xlPasteAll \'粘贴数据
        
            ThisWorkbook.Sheets(sheetName).Cells(i, 1).PasteSpecial Paste:=xlPasteColumnWidths \'粘贴列宽


            sheetRowTotalArray(sheetNum) = sheetRowTotalArray(sheetNum) + sourceWb.Sheets(sheetName).UsedRange.Rows.Count \'叠加每一个工作簿的总行数


            \'如果当前表格文件不是第一个打开的,则删除该表格工作薄的表头
            If fileNum > 0 Then
                ThisWorkbook.Sheets(sheetName).Rows(i).Delete
            End If
            
            
            sheetNum = sheetNum + 1

        Next sheetName
        

        
        sourceWb.Close (False) \'复制粘贴完成后关闭被合并的表
        
        fileName = Dir  \'继续遍历

        fileNum = fileNum + 1
    Loop
    
    
    
    
    
    
    
    
    \'数据校验和清理
    \'
    \'
    \'
    Dim tmpRowTotal% \'定义一个临时变量
    Dim isSuccess As Boolean  \'定义是否合并成功
    
    
    isSuccess = True
    

    sheetNum = 1
    For Each sheetName In sheetNameArray
        
        tmpRowTotal = ThisWorkbook.Sheets(sheetName).UsedRange.Rows.Count + fileNum - 1 \'获取当前工作簿的总行数,需要加上子表的所有表头并减一行


        If tmpRowTotal <> sheetRowTotalArray(sheetNum) Then \'判断是否全部拷贝过来了
            isSuccess = False
            ThisWorkbook.Sheets(sheetName).Delete \'按名称删除工作簿
        Else
            ThisWorkbook.Sheets(sheetName).Rows(1).Delete \'遍历删除表格的第一行,因为是空白行
            
        End If
        
        sheetNum = sheetNum + 1
        
    Next sheetName
    
    
    
    If isSuccess Then
    
        sheetsSum = sheetsSum + 1
    
        ThisWorkbook.Sheets(sheetsSum).Delete \'删除最后一个工作簿
            
        MsgBox "工作表合并完毕"
    Else
        
        MsgBox "合并失败,总行数不相等!!!"
    End If
    
    
    
    
    

    Application.DisplayAlerts = True \'恢复警告提示

    Application.ScreenUpdating = True \'开启屏幕刷新

    

End Sub

 

分类:

技术点:

相关文章:

  • 2021-11-24
  • 2021-11-23
  • 2021-11-19
  • 2021-07-25
  • 2021-09-02
  • 2021-12-11
  • 2021-10-06
猜你喜欢
  • 2021-11-19
  • 2022-02-09
  • 2021-12-05
  • 2021-10-04
  • 2021-11-24
  • 2021-08-12
  • 2021-11-19
相关资源
相似解决方案