当前位置: 首页 > article >正文

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

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

先看下 excel 的结构

合并的结果

log 记录

vba 代码

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


http://www.kler.cn/a/430552.html

相关文章:

  • qt QZipReader详解
  • 鸿蒙之路的坑
  • 我的Opencv
  • AIGC:生成图像动力学
  • 使用C#生成一张1G大小的空白图片
  • Java:188 基于springboot妇幼健康管理系统
  • C# 异常处理全解析:让程序告别崩溃噩梦
  • 在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下:
  • 家校通小程序实战教程06口令验证
  • ArrayBuffer,TypedArray,Int8Array 和Blob的关系
  • python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
  • EFCore PostgreSQL在.NET9生成迁移文件错误
  • 【前端】浏览器输入url到页面呈现发生了什么?
  • csrf漏洞复现
  • Copilot for Microsoft 365 Plugins 示例项目教程
  • FM25V20A-DGQ:耐用、快速、低功耗的F-RAM
  • kcat - Apache Kafka producer and consumer tool
  • 调度系统:基于 Couchbase 构建数仓 Temporal、Apache Airflow 和 DonpinScheduler 的详细比较
  • IdentityServer4框架、ASP.NET core Identity
  • ios使用UIScrollView和PageControl创建图片轮播
  • selenium学习:等待方式
  • 网络安全法-网络运行安全
  • Scala正则表达式
  • UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)
  • 大数据新视界 -- Hive 临时表与视图的应用场景(下)(30 / 30)
  • 机器学习 (西瓜书) 内容概要【不含数学推导】