Excel 合并工具 将文件复制到目标工作表中与操作日志记录

指定文件夹中读取符合条件的 Excel 文件,将其中的数据按照一定规则复制到目标工作表中,并进行相关的日志记录和工作簿保存操作。

先看下 excel 的结构

合并的结果

log 记录

vba 代码

vbscript 复制代码
Sub DeltaCheck()
' 作者和创建时间的注释

    ' 定义工作表变量
    Dim ws As Worksheet
    ' 以下几行暂时禁用了一些 Excel 的默认功能,以提高运行效率和避免干扰
'    Application.ScreenUpdating = 0
'    Application.Calculation = xlCalculationManual
'    Application.DisplayAlerts = False

    ' 设置相关工作表
    Set shtIND = ThisWorkbook.Worksheets("设置")

    '<<<<<<  设置参数
    ' 定义各种工作簿、工作表、文件夹路径、行列范围等参数
    Set wbComin = ThisWorkbook
    filFr1 = shtIND.Range("B3")
    shtFr1 = shtIND.Range("B4")
    fldFr1 = shtIND.Range("B5") & "\"
    shtTo1 = shtIND.Range("B8")
    vT1 = shtIND.Range("B9")
    vTr = vT1 + 1  ' 标题的下一行
    vCF = shtIND.Range("E4")  ' 复制的列起始
    vCT = shtIND.Range("F4")  ' 复制的列结束
    vCFn = shtIND.Range("E5")  ' 复制的列起始编号
    vCTN = shtIND.Range("F5")  ' 复制的列结束编号

    vPF = shtIND.Range("E8")  ' 粘贴的列起始
    vPT = shtIND.Range("F8")  ' 粘贴的列结束
    vPFn = shtIND.Range("E9")  ' 粘贴的列起始编号
    vPTn = shtIND.Range("F9")  ' 粘贴的列结束编号
    vPFile = shtIND.Range("G8")
    sheetName = shtTo1

    '<<<<< 日志相关
    ' 处理"LOG"工作表,如果不存在则创建,存在则删除后重新创建
    On Error Resume Next
        Set ws = Worksheets("LOG")
        If Err Then       ' 如果"LOG"工作表不存在
            shtIND.Select
            ActiveWorkbook.Sheets.Add After:=shtIND
            ActiveSheet.Name = "LOG"
            On Error GoTo 0
         Else
            ' 如果"LOG"工作表存在
            Sheets("LOG").Select
            Application.DisplayAlerts = False
            Sheets("LOG").Delete
            shtIND.Select
            ActiveWorkbook.Sheets.Add After:=shtIND
            ActiveSheet.Name = "LOG"
        End If
    Set shtLog = ThisWorkbook.Worksheets("LOG")
    ' 设置"LOG"工作表的表头
    shtLog.Range("A1").Value = "File Name"
    shtLog.Range("B1").Value = "Copy From Area"
    shtLog.Range("C1").Value = "Copy To Area"
    shtLog.Range("D1").Value = "Row Count"
    shtLog.Range("E1").Value = "Log Time"
    LogRow = 2

    '<<<< 设置"复制到"的工作表
    ' 类似"LOG"工作表的处理,对指定的目标工作表进行处理
    On Error Resume Next
        Set ws = Worksheets(sheetName)
        If Err Then       ' 如果目标工作表不存在
            shtIND.Select
            ActiveWorkbook.Sheets.Add After:=shtIND
            ActiveSheet.Name = sheetName
            On Error GoTo 0
         Else
            ' 如果目标工作表存在
            Sheets(sheetName).Select
            Application.DisplayAlerts = False
            Sheets(sheetName).Delete
            shtIND.Select
            ActiveWorkbook.Sheets.Add After:=shtIND
            ActiveSheet.Name = sheetName
        End If
    Set shtA = ThisWorkbook.Worksheets(shtTo1)
    shtA.Select
    shtA.Range(Cells(1, vPTn + 1), Cells(1, vPTn + 1)).Value = "FileName"

    ' 开始复制 Excel 数据
    MyFile = Dir(fldFr1)
    Do While MyFile <> " "
        If MyFile = "" Then Exit Do
        If MyFile Like filFr1 Then
            AEndRow = shtA.Range("A90000").End(xlUp).Row

            ' 复制新数据
            Set wbOpen1 = Workbooks.Open(fldFr1 & "\" & MyFile)
            Set shtOpen1 = wbOpen1.Worksheets(shtFr1)
            shtOpen1.Select
            OEndRow = shtOpen1.Range("A90000").End(xlUp).Row

            ' 根据不同情况进行复制和粘贴操作,并记录日志
            If OEndRow < vTr Then
                ' <<<< log
                shtLog.Range("A" & LogRow).Value = MyFile
                shtLog.Range("B" & LogRow).Value = ""
                shtLog.Range("C" & LogRow).Value = ""
                shtLog.Range("D" & LogRow).Value = OEndRow - vT1
                shtLog.Range("E" & LogRow).Value = Now()
            Else
                If AEndRow <= vTr Then
                    shtOpen1.Range(vCF & "1:" & vCT & OEndRow).Copy Destination:=shtA.Range("A1:" & vPT & OEndRow)
                    shtA.Range(vPFile & "2:" & vPFile & (OEndRow)).Value = MyFile
                Else
                    shtOpen1.Range(vCF & vTr & ":" & vCT & OEndRow).Copy Destination:=shtA.Range("A" & AEndRow + 1 & ":" & vPT & AEndRow + OEndRow - vT1)
                    shtA.Range(vPFile & AEndRow + 1 & ":" & vPFile & (AEndRow + OEndRow - vT1)).Value = MyFile
                End If
                ' <<<< log
                shtLog.Range("A" & LogRow).Value = MyFile
                shtLog.Range("B" & LogRow).Value = vCF & vTr & ":" & vCT & OEndRow
                shtLog.Range("C" & LogRow).Value = "A" & AEndRow + 1 & ":" & vPT & AEndRow + OEndRow - vT1
                shtLog.Range("D" & LogRow).Value = OEndRow - vT1
                shtLog.Range("E" & LogRow).Value = Now()
            End If
            LogRow = LogRow + 1
            wbOpen1.Close savechanges:=False
        End If

        ' 处理下一个文件
        MyFile = Dir
    Loop

    shtIND.Select

    ' 根据工作簿名称进行处理并保存
    thisFileName = ThisWorkbook.Name
    If IsNumeric(Left(thisFileName, 8)) Then
      thisFileName = Right(thisFileName, Len(thisFileName) - 8)
    End If
    SaveToFileName = ThisWorkbook.Path & "\" & Format(Date, "yyyymmdd") & thisFileName
    wbComin.SaveAs Filename:=SaveToFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

    ' 再次保存工作簿
    SaveToFileName = ThisWorkbook.Path & "\" & shtIND.Range("AA1")
    wbComin.SaveAs Filename:=SaveToFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    shtIND.Select

    ' 恢复 Excel 的默认设置
'    Application.Calculation = xlCalculationAutomatic
'    Application.ScreenUpdating = True
'    Application.DisplayAlerts = True
End Sub
相关推荐
开开心心就好11 小时前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
fqbqrr16 小时前
2601Mfc,自动化excel
自动化·excel·mfc
tlwlmy16 小时前
python excel图片批量导出
开发语言·python·excel
TracyDemo1 天前
excel 透视图怎么进行删除透视图
excel
骆驼爱记录1 天前
Excel邮件合并嵌入图片技巧
自动化·word·excel·wps·新人首发
avi91112 天前
Unity Data Excel读取方法+踩坑记;和WPS Excel的一些命令
unity·游戏引擎·excel·wps·data
梦幻通灵2 天前
Excel多个sheet合并透视表实现方案【持续更新】
excel
开开心心就好2 天前
键盘映射工具改键位,绿色版设置后重启生效
网络·windows·tcp/ip·pdf·计算机外设·电脑·excel
恬淡如雪2 天前
Excel接口测试自动化实战
爬虫·python·excel
速易达网络2 天前
linux命令大全
linux·运维·excel