使用VBA,优化处理Excel表格
前言
上周末,XX给我抱怨:因为计算绩效奖金,把2个人的工资发错了,还被扣了500元。问的缘由得知,她每个月要处理十来个excel表格,每次都要手动修改里面的值,如果修改了一处,其他地方也要修改,然后还要多处地方核对。导致光这件事情就要消耗三四天,伤神费力。
我就问她,整个是不是都是机械性重复的工作,如果是的话,完全可以用电脑来代替。然后我就帮她找工具来优化她的工作,减少出错机会。
现状
- 目前他们公司总共有四五十人;
- 需要整理的excel有12份;
- excel间有很多重复数据,同样的数据存在在多分表中;
- excel之间相互引用数据很频繁,杂乱,牵一发而动全身。
两种方案
- 使用HRM管理系统,在网上找到三套有源码的软件:
- 仅仅在github上面找到一个中文的系统 hrms(github大量英文系统)。--需要自己找服务器部署
- 悟空HRM,PHP开源,文档也比较详细,中文。试用了一下在线版本,功能无法满足需求,需要二次开发,同步需要服务器部署。
- OrangeHRM,是阿里云市场里面,也需要购买服务器。
总结:现在目前找到的都是web版的系统,都需要在线部署。没有找到桌面版本,可以立即使用的那种。都不太适合目前的情况。
- 使用Excel自带的函数和宏,来实现简化实际工作的,最终实现此方案:
- 重新梳理Excel间的关系,提取出:原始数据、规则(函数计算后的数据);
- 原始数据,抽取出来作为独立的Excel,类似于数据库的概念:
- 稳定数据:不经常变动的数据,如:人员基本信息,固定工资等;
- 月数据:每月统计都会发生变化的数据,如:考勤数据,绩效等;
- 规则,编辑成Excel模板文件(*.xltx),里面一定不存在原始类的数据:
- 引用:引用自原始数据,所有引用只能来源原始数据,不能出现引用引用的数据;
- 计算公式:使用excel的函数,如:=sum()等;
- 使用VBA宏,根据原始数据和模板文件,生成不带公式的纯xlsx文件。目的,不依赖其他文件。
宏代码
实现功能(下载demo):
- 批量读取模板文件,生成xlsx文件;官方文档另存的枚举类型
- 替换掉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表格的更多相关文章
- VBA取得EXCEL表格中的行数和列数
VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...
- VBA基础之Excel VBA 表格的操作(一)
一.Excel VBA 表格的操作1. Excel表格的指定以及表格属性的设置 Sub main() '把表格B2的值改为"VBA Range和Cells函数" Range(&qu ...
- 用多线程优化Excel表格数据导入校验的接口
公司的需求,当前某个Excel导入功能,流程是:读取Excel数据,传入后台校验每一条数据,判断是否符合导入要求,返回给前端,导入预览展示.(前端等待响应,难点).用户再点击导入按钮,进行异步导入(前 ...
- Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented
在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...
- VS2010 C++ 操作Excel表格的编程实现
转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...
- java对excel表格的上传和下载处理
Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...
- 【游戏开发】Excel表格批量转换成CSV的小工具
一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...
- 火狐浏览器导出EXCEL 表格,文件名乱码问题
牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...
- [LeetCode] Design Excel Sum Formula 设计Excel表格求和公式
Your task is to design the basic function of Excel and implement the function of sum formula. Specif ...
随机推荐
- 微信小程序 条件渲染 wx:if
1.在框架中,我们用wx:if="{{condition}}"来判断是否需要渲染该代码块 <view wx:if="{{condition}}"> ...
- JavaScript 常用数组函数方法专题
1. 由字符串生成数组 split() 分割字符串,并将分割的部分作为一个元素保存在一个新建的数组中. var str1 = "this is an emample to using the ...
- HBase 笔记1
cap理论: 一致性 可用性 可靠性 任何分布式系统只能最多满足上面2点,无法全部满足 NOSQL = Not Only SQL = 不只是SQL HBase速度并不快,知识当数据量很大时它慢 ...
- linux下安装svn服务器
http://www.cnblogs.com/zhoulf/archive/2013/02/02/2889949.html 安装说明系统环境:CentOS-6.3安装方式:yum install (源 ...
- Kindle:自动追更之云上之旅
2017年5月27: 原来的程序是批处理+Python脚本+Calibre2的方式,通过设定定时任务的方式,每天自动发动到自己的邮箱中.缺点是要一直开着电脑,又不敢放到服务器上~~ 鉴于最近公司查不关 ...
- 【转】Sqlserver将数据从一个表插入到另一个表
-- 复制表结构CREATE TABLE empty_table_name LIKE table_name; --根据table_name创建一个空表empty_table_name,empty_ta ...
- mysql 事务锁超时时间 innodb_lock_wait_timeout
mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...
- Linux基础命令---lpq查看打印队列
lpq lpq指令用来显示当前打印队列的状态.如果命令行中没有指定打印机或类,则将显示默认目标上排队的作业. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.ope ...
- vue路由1:基本使用
路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮 => home 内容, ...
- docker overlay
http://blog.csdn.net/jiangshouzhuang/article/details/52822125