前言

  上周末,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中的公式,只显示值。
 1 Sub ChangeFileFormat(xltxFolder, xlsxFolder)
 2
 3     Dim strCurrentFileExt   As String
 4     Dim strNewFileExt       As String
 5     Dim objFSO              As Object
 6     Dim objFolder           As Object
 7     Dim objFile             As Object
 8     Dim xlFile              As Workbook
 9     Dim strNewName          As String
10     Dim strXltxFolderPath       As String
11     Dim strXlsxFolderPath       As String
12
13     Set objFSO = CreateObject("Scripting.FileSystemObject")
14
15     strCurrentFileExt = ".xltx"
16     strNewFileExt = ".xlsx"
17
18     strXltxFolderPath = ThisWorkbook.Path & "\" & xltxFolder & "\"
19     strXlsxFolderPath = ThisWorkbook.Path & "\" & xlsxFolder & "\"
20
21     If Not objFSO.FolderExists(strXltxFolderPath) Then   '判断指定文件夹是否存在
22         MsgBox "【模板文件】文件夹不存在"
23         Exit Sub
24     End If
25
26     If Not objFSO.FolderExists(strXlsxFolderPath) Then   '判断指定文件夹是否存在
27         fs.CreateFolder strXlsxFolderPath
28     End If
29
30     Set objFolder = objFSO.getfolder(strXltxFolderPath)
31     For Each objFile In objFolder.Files '循环所有的模板文件
32         strNewName = objFile.Name
33         If Right(strNewName, Len(strCurrentFileExt)) = strCurrentFileExt Then
34             Application.AskToUpdateLinks = False     '关闭程序询问更新链接提示
35             Application.DisplayAlerts = False
36             ThisWorkbook.UpdateLinks = xlUpdateLinksAlways  '更新链接
37
38             Set xlFile = Workbooks.Open(objFile.Path, , True) '读取模板文件
39             For Each sh In xlFile.Sheets  '替换文件中的公式
40                sh.UsedRange.Value = sh.UsedRange.Value
41             Next
42
43             strNewName = Replace(strNewName, strCurrentFileExt, strNewFileExt) '替换文件名为新的文件名
44             Select Case strNewFileExt
45             Case ".xlsx"
46                 xlFile.SaveAs strXlsxFolderPath & strNewName, XlFileFormat.xlOpenXMLWorkbook '保存为不带宏的excel
47             Case ".xlsm"
48                 xlFile.SaveAs strXlsxFolderPath & strNewName, XlFileFormat.xlOpenXMLWorkbookMacroEnabled '保存为带宏的excel
49             End Select
50             xlFile.Close
51             Application.AskToUpdateLinks = True
52             Application.DisplayAlerts = True
53         End If
54     Next objFile
55
56 ClearMemory:
57     strCurrentFileExt = vbNullString
58     strNewFileExt = vbNullString
59     Set objFSO = Nothing
60     Set objFolder = Nothing
61     Set objFile = Nothing
62     Set xlFile = Nothing
63     strNewName = vbNullString
64     strFolderPath = vbNullString
65 End Sub

总结

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

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

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

转载于:https://www.cnblogs.com/BenAndWang/p/7200467.html

使用VBA,优化处理Excel表格相关推荐

  1. 用python或者vba把一个excel表格拆分成多个excel表格

    工作中有时候会碰到需要把一张大的表格(行数多)分拆成多个表格的情况,虽然不太符合常理,如果一张表格太大,数据导出的时候就应该拆好,但实际上基于各种原因还是会碰到. python脚本,比较简单也比较好理 ...

  2. Word VBA(批量复制Excel表格和Word表格到Word中)

    Function Test()  '使用双字典          SearchPath = FolderDialog("请选择文件夹")     If SearchPath = & ...

  3. 【VBA编程】excel表格中特定文字加上下划线

    效果如下: Public Sub 加下划线() Cells(7, 1) = Cells(5, 12) + Cells(6, 12) + Cells(7, 12) Dim St$, i&, j& ...

  4. 用VBA得到EXCEL表格中的行数和列数

    用VBA得到EXCEL表格中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count ActiveShe ...

  5. 多线程导出excel高并发_用多线程优化Excel表格数据导入校验的接口

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

  6. 利用VBA代码合并多个Excel表格

    步骤1:将待合并表格放入同一文件夹 步骤2:在文件件中新建一个表格 步骤3:在新表格中右击"sheet1"--"查询代码" 步骤4:输入上述代码,并运行子程序. ...

  7. select vba 网页 翻页_通过VBA程序来实现Excel表格翻页的方法

    在查看拥有较多数据的Excel工作表时,可以通过按"PageUp"或"PageDown"键(或拖动程序窗口左侧滚动条上的滑块)来进行翻页操作.实际上,用户还可以 ...

  8. VBA按列名称或是按表格标题给EXCEL表格做排序

    VBA给EXCEL表格做排序 按列名称或是按标题给表格排序 按列名称或是按标题给表格排序 在VBA编程时,经常会对表格内容进行排序,为了方便对不同需求下的内容排序,编制了下面这个函数,此函数可以根据给 ...

  9. excel android vba,你加班1小时做Excel表格,我用VBA只需1分钟!(免费领教程)

    VBA的使用领域非常广泛,HR数据统计和分析.日常办公.都可以看到它的身影,用好VBA轻松助你一臂之力. 什么是VBA? 一句话概括:在Excel中想实现什么功能,就可以用VBA语言编写一段程序去完成 ...

  10. 已有一个Excel表格,用VBA批量新建文件夹

    已有一组Excel表格数据,使用VBA快速批量建文件夹 不知道标题怎么写. 已经有了这样一组数据 然后需要根据这两组数据新建文件夹,代码如下 Sub 建文件夹()Dim i As Integer '用 ...

最新文章

  1. 接口与object的关系
  2. java小练习:.根据输入的月份,判断该月份有多少天
  3. 自动更新AndroidManifest版本号
  4. linux java mysql 备份 runtime_Linux下mysql定时备份脚本以及java实现
  5. WCF 客户端代理生成 通过SvcUtil.exe
  6. 2020-09-11
  7. IPC--三---共享内存
  8. Java mail 发送邮件 主题(标题)乱码
  9. Collection 和 Collections区别
  10. python脚本自动化盲注_三、基于报错型注入和sql盲注的自动化实现
  11. 转HTML、CSS、font-family:中文字体的英文名称
  12. win10微软图标点击无反应_win10开始菜单,不出来,任务栏右击无反应
  13. 远程 导数据 mysql_mysql远程导入
  14. java异常的嵌套和级联
  15. ACP 学习-07-CDN
  16. 计算机不能显示可移动磁盘咋办,移动硬盘不显示盘符怎么办 移动硬盘显示不出来解决方法【详解】...
  17. shiny 服务器未响应,shiny-server 安装过程出现问题总结
  18. TSV文件与CSV文件的区别
  19. 用java在正方体上贴图片_THREE.js为正方体的6个面贴上图片
  20. 面向95后的营销和增长,你需要知道这些( ゜- ゜)つロ 乾杯

热门文章

  1. varnish mysql_Varnish+nginx+mysql+php 环境搭建(四) 转载(lamppr)
  2. informix设置数据库默认插入时间_informix常用时间运算和操作方式
  3. 如何确定地址_小规模公司注册地址 创业者该如何选择
  4. python字符串的删除操作_学习快人一步|python中常见的27个字符串操作
  5. python制作翻译器代码_翻译器(3)
  6. Jmeter中获取返回结果中的值
  7. Windows 2003域更名工具(Domain Rename Tool)
  8. nsupdate处理ns注意事项
  9. Oracle 12c多租户特性详解:PDB 的出与入 InAndOut
  10. ORACLE数据泵还原(IMPDP命令)【转】