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

news2024/12/23 14:09:54

指定文件夹中读取符合条件的 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.coloradmin.cn/o/2257830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github----提交人不是自己

账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …

ZZCMS2023存在跨站脚本漏洞(CNVD-2024-44822、CVE-2024-44818)

ZZCMS是一款用于搭建招商网站的CMS系统&#xff0c;由PHP语言开发&#xff0c;可快速搭建&#xff1a;医药招商、保健品招商、化妆品招商、农资招商、孕婴童招商、酒类副食类等招商网站。 国家信息安全漏洞共享平台于2024-11-14公布其存在跨站脚本漏洞。 漏洞编号&#xff1a…

[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业OA自动化办公管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…

【MySQL】表的基本查询(下)

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

目前Java后端就业前景到底怎么样?

很多人都说今年对于IT行业根本没有所谓的“金三银四”“金九银十”。在各大招聘网站或者软件上不管是大厂还是中小公司大多都是挂个招聘需求&#xff0c;实际并不招人&#xff1b;在行业内的程序员基本都已经感受到了任老前段时间口中所谓的“寒气”。 虽然事实确实是如此&…

机器学习--张量

机器学习–张量 机器学习的数据结构–张量 张量是机器学习程序中的数字容器&#xff0c;本质上就是各种不同维度的数组&#xff0c;如下图所示。 张量的维度称为轴&#xff08;axis&#xff09;&#xff0c;轴的个数称为阶&#xff08;rank&#xff09; 标量–0D张量 impor…

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…

uni-app之web-view组件 postMessage 通信【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…

数据结构 (37)外排序的基本方法

前言 外排序&#xff08;External Sorting&#xff09;是指处理那些无法完全加载到内存中的数据集时所使用的排序方法。由于数据量巨大&#xff0c;无法一次性全部放入内存&#xff0c;因此需要使用外部存储设备&#xff08;如磁盘&#xff09;来辅助排序过程。外排序的基本方法…

「Mac玩转仓颉内测版49」小学奥数篇12 - 图形变换与坐标计算

本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换&#xff0c;并学会用编程实现坐标变化。 关键词 小学奥数Python Cangjie图形变换坐标计算 一、题目描述 编写一个程序&#xff0c;模拟以下三种图形变换&a…

springboot系列--拦截器加载原理

一、拦截器加载原理 拦截器是在容器启动时&#xff0c;就创建并加载好&#xff0c;此时并未放入拦截器链中&#xff0c;只是放在一个拦截器集合当中&#xff0c;当一个请求进来之后&#xff0c;会通过匹配路径&#xff0c;查看是否有命中集合中的拦截器的拦截路径&#xff0c;如…

高通QCA-WiFi-10.4驱动源码解析文档:无线驱动开发的利器

高通QCA-WiFi-10.4驱动源码解析文档&#xff1a;无线驱动开发的利器 【下载地址】高通QCA-WiFi-10.4驱动源码解析文档分享 本仓库提供了一份高通最新的QCA-WiFi-10.4驱动源码解析文档&#xff0c;该文档对于无线驱动开发人员来说&#xff0c;是一份非常宝贵的帮助资料。通过这份…

数据结构与算法 五大算法

文章目录 1&#xff0c;时间复杂度与空间复杂度 2&#xff0c;插入排序 3&#xff0c;希尔排序 4&#xff0c;选择排序 1&#xff0c;单趟排序 2&#xff0c;选择排序PLUS版本 5&#xff0c;冒泡排序 6&#xff0c;快速排序 1&#xff0c;hoare版本 2&#xff0c;挖坑法 前言 …

数据链路层总结

- - 链路、物理链路&#xff1a;两节点间物理线路&#xff08;有线、无线&#xff09;&#xff0c;中间没有任何其他的交换节点 数据链路、逻辑链路&#xff1a; 链路 协议需要的硬件、软件 网络适配器(网卡)&#xff1a;包含物理层、数据链路层 网络适配器软件驱动程…

入门pytorch-Transformer

前言 虽然Transformer是2017年由Google推出&#xff0c;如果按照读论文只读近两年的思路看&#xff0c;那它无疑是过时的&#xff0c;但可惜的是&#xff0c;目前很多论文的核心依然是Transformer&#xff0c;或者由其进行改进的&#xff0c;故本文使用pytorch来搭建一下Trans…

PHP中GD库的使用

由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…

ThingsBoard规则链节点:RabbitMQ 节点详解

ThingsBoard 是一个开源的物联网平台&#xff0c;允许开发者快速构建IoT产品。它提供了设备连接、数据收集、处理和可视化等功能。为了实现高效的数据处理和消息传递&#xff0c;ThingsBoard 集成了多种消息队列服务&#xff0c;其中就包括了RabbitMQ。 RabbitMQ 是一个广泛使用…

健康管理系统(Koa+Vue3)

系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…

Muduo 网络库 入门详解

文章目录 1. 什么是 Muduo 网络库&#xff1f;2. Muduo 的核心架构2.1 EventLoop2.2 Channel2.3 Poller2.4 TimerQueue2.5 TcpServer 和 TcpConnection架构图 3. Muduo 的工作原理4. 部分组件介绍4.1 ProtobufCodec4.2 ProtobufDispatcher4.3 muduo::net::EventLoop4.4 muduo::…