前言

  上周末,XX给我抱怨:因为计算绩效奖金,把2个人的工资发错了,还被扣了500元。问的缘由得知,她每个月要处理十来个excel表格,每次都要手动修改里面的值,如果修改了一处,其他地方也要修改,然后还要多处地方核对。导致光这件事情就要消耗三四天,伤神费力。

我就问她,整个是不是都是机械性重复的工作,如果是的话,完全可以用电脑来代替。然后我就帮她找工具来优化她的工作,减少出错机会。

现状

  1. 目前他们公司总共有四五十人;
  2. 需要整理的excel有12份;
  3. excel间有很多重复数据,同样的数据存在在多分表中;
  4. excel之间相互引用数据很频繁,杂乱,牵一发而动全身。

两种方案

  1. 使用HRM管理系统,在网上找到三套有源码的软件:

    • 仅仅在github上面找到一个中文的系统 hrms(github大量英文系统)。--需要自己找服务器部署
    • 悟空HRM,PHP开源,文档也比较详细,中文。试用了一下在线版本,功能无法满足需求,需要二次开发,同步需要服务器部署。
    • OrangeHRM,是阿里云市场里面,也需要购买服务器。

    总结:现在目前找到的都是web版的系统,都需要在线部署。没有找到桌面版本,可以立即使用的那种。都不太适合目前的情况。

  2. 使用Excel自带的函数和宏,来实现简化实际工作的,最终实现此方案
    • 重新梳理Excel间的关系,提取出:原始数据、规则(函数计算后的数据);
    • 原始数据,抽取出来作为独立的Excel,类似于数据库的概念:
      • 稳定数据:不经常变动的数据,如:人员基本信息,固定工资等;
      • 月数据:每月统计都会发生变化的数据,如:考勤数据,绩效等;
    • 规则,编辑成Excel模板文件(*.xltx),里面一定不存在原始类的数据:
      • 引用:引用自原始数据,所有引用只能来源原始数据,不能出现引用引用的数据;
      • 计算公式:使用excel的函数,如:=sum()等;
    • 使用VBA宏,根据原始数据和模板文件,生成不带公式的纯xlsx文件。目的,不依赖其他文件。

宏代码

  实现功能(下载demo):

  1. 批量读取模板文件,生成xlsx文件;官方文档另存的枚举类型
  2. 替换掉excel中的公式,只显示值。
 Sub ChangeFileFormat(xltxFolder, xlsxFolder)

     Dim strCurrentFileExt   As String
Dim strNewFileExt As String
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim xlFile As Workbook
Dim strNewName As String
Dim strXltxFolderPath As String
Dim strXlsxFolderPath As String Set objFSO = CreateObject("Scripting.FileSystemObject") strCurrentFileExt = ".xltx"
strNewFileExt = ".xlsx" strXltxFolderPath = ThisWorkbook.Path & "\" & xltxFolder & "\"
strXlsxFolderPath = ThisWorkbook.Path & "\" & xlsxFolder & "\" If Not objFSO.FolderExists(strXltxFolderPath) Then '判断指定文件夹是否存在
MsgBox "【模板文件】文件夹不存在"
Exit Sub
End If If Not objFSO.FolderExists(strXlsxFolderPath) Then '判断指定文件夹是否存在
fs.CreateFolder strXlsxFolderPath
End If Set objFolder = objFSO.getfolder(strXltxFolderPath)
For Each objFile In objFolder.Files '循环所有的模板文件
strNewName = objFile.Name
If Right(strNewName, Len(strCurrentFileExt)) = strCurrentFileExt Then
Application.AskToUpdateLinks = False '关闭程序询问更新链接提示
Application.DisplayAlerts = False
ThisWorkbook.UpdateLinks = xlUpdateLinksAlways '更新链接 Set xlFile = Workbooks.Open(objFile.Path, , True) '读取模板文件
For Each sh In xlFile.Sheets '替换文件中的公式
sh.UsedRange.Value = sh.UsedRange.Value
Next strNewName = Replace(strNewName, strCurrentFileExt, strNewFileExt) '替换文件名为新的文件名
Select Case strNewFileExt
Case ".xlsx"
xlFile.SaveAs strXlsxFolderPath & strNewName, XlFileFormat.xlOpenXMLWorkbook '保存为不带宏的excel
Case ".xlsm"
xlFile.SaveAs strXlsxFolderPath & strNewName, XlFileFormat.xlOpenXMLWorkbookMacroEnabled '保存为带宏的excel
End Select
xlFile.Close
Application.AskToUpdateLinks = True
Application.DisplayAlerts = True
End If
Next objFile ClearMemory:
strCurrentFileExt = vbNullString
strNewFileExt = vbNullString
Set objFSO = Nothing
Set objFolder = Nothing
Set objFile = Nothing
Set xlFile = Nothing
strNewName = vbNullString
strFolderPath = vbNullString
End Sub

总结

  在这个过程中,考虑的时候,使用到了:模块,数据唯一性,避免交叉引用,这些开发中的经验。

  其实我觉得,整个过程中,VBA的编写占据了我最多的时间。查资料,找文档。(百度就是个大坑!!!)

  不熟悉Excel函数导致,当我写完一个宏的时候,发现VLOOKUP已经早就实现这个功能了。

使用VBA,优化处理Excel表格的更多相关文章

  1. VBA取得EXCEL表格中的行数和列数

    VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...

  2. VBA基础之Excel VBA 表格的操作(一)

    一.Excel VBA 表格的操作1. Excel表格的指定以及表格属性的设置 Sub main() '把表格B2的值改为"VBA Range和Cells函数" Range(&qu ...

  3. 用多线程优化Excel表格数据导入校验的接口

    公司的需求,当前某个Excel导入功能,流程是:读取Excel数据,传入后台校验每一条数据,判断是否符合导入要求,返回给前端,导入预览展示.(前端等待响应,难点).用户再点击导入按钮,进行异步导入(前 ...

  4. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

  5. VS2010 C++ 操作Excel表格的编程实现

    转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...

  6. java对excel表格的上传和下载处理

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...

  7. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  8. 火狐浏览器导出EXCEL 表格,文件名乱码问题

    牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...

  9. [LeetCode] Design Excel Sum Formula 设计Excel表格求和公式

    Your task is to design the basic function of Excel and implement the function of sum formula. Specif ...

随机推荐

  1. 十一、无事勿扰,有事通知(2)——KVO

    概述 Key-Value-Observe,简称KVO,和上节介绍的Notification师出同门,主要目的都是为了实现观察者模式. 虽说是同门师兄弟,但是各自精通的技艺却是各不相同的. 不像Noti ...

  2. redis安装及错误排查

    安装: 1.cd /usr/redis   //redis目录作为安装目录,没有自行创建 2.tar xzf  redis-4.0.6.tar.gz 3. cd redis-4.0.6 4.make ...

  3. 让hive的表注释和字段注释支持中文

    此处用的数据库类型为mysql.发现hive在初始化创建这些表的时候,大部分字段的字符集给设置成了latin1,然后collation设成了latin1_bin. 但是我们在hive中创建表时,表注释 ...

  4. JVM探秘5---JVM监控命令大全

    jps命令---查看JVM进程状况 格式为:jps [options] [hostid] 功能描述: jps是用于查看有权访问的hotspot虚拟机的进程. 当未指定hostid时,默认查看本机jvm ...

  5. 配置jmeter环境变量及运行命令解释

    Linux下Jmeter的安装及环境变量的配置 1.将Jmeter的安装包上传至Linux的/opt目录下,解压,如下图: 2.编辑/etc/profile文件配置Jmeter的环境变量 3.将编辑好 ...

  6. 关于django1.8版本的静态文件配置

    环境:Python3.5.4,django1.8.1. 在页面使用js时,总是提示404找不到js文件. 于是,看看了settings文件 好像也没什么毛病.导入的方式也换了很多种,总是不行,于是只好 ...

  7. ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台

    一.简介 ELK 由三部分组成elasticsearch.logstash.kibana,elasticsearch是一个近似实时的搜索平台,它让你以前所未有的速度处理大数据成为可能. Elastic ...

  8. docker启动容器报错: could not synchronise with container process: not a directory

    错误现象 在运行容器时,出现以下错误 [root@localhost test]# docker run -it -d -v $PWD/test.txt:/mydir mytest fd44cdc55 ...

  9. 清除wnTKYg 这个挖矿工木马的过程讲述

    由于工作需要,我由一个专业java开发工程师,渐渐的也成为了不专业的资深的运维工程师了.感慨一番,书归正传,下面就讲解wnTKYg如何清除.最近项目在做性能测试,发现CPU使用率异常,无人访问时CPU ...

  10. 王之泰201771010131《面向对象程序设计(java)》第九周学习总结

    第一部分:理论知识学习部分 第7章异常.日志.断言和调试 概念:异常.异常类型.异常声明.异常抛出. 异常捕获1.异常处理技术2.断言的概念及使用3.基本的调试技巧 1)异常的概念 a.Java的异常 ...