zoukankan      html  css  js  c++  java
  • XLSX 表格合并VBA代码

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

    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
  • 相关阅读:
    未来开发构想:
    3种方式遍历repeater中的CheckBox全选
    [常见面试题]一条Sql语句:取出表A中第31到第40记录,ID可能不是连续的
    mpc源代码下载,编译,调试
    哈希表(Hashtable)使用
    ASP.NET常用代码
    [转]Erwin4.1.4与PowerDesign9.5
    Three things everyone should know to improve object retrieval
    Learning the parts of objects by nonnegative matrix factorization (Letters to Nature)
    js 钟表
  • 原文地址:https://www.cnblogs.com/phpdragon/p/13590855.html
Copyright © 2011-2022 走看看