前言

  上周末,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. Python学习之数组类型一:

    Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建:  向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...

  2. JavaScript知识精简

      JS单线程,同步,一次执行某一段代码,等到前一个程序执行完毕再执行.,阻塞,安全. 多线程,异步,不用等到前一个程序执行完毕就执行. 数据类型 JavaScript 是 弱类型 语言,但并不是没有 ...

  3. Mysql模糊查询Like传递参数的语句

    set @keyWord='我的': select * from tblcontent where content like CONCAT('%',@keyWord,'%')

  4. phpcms首页替换

    大图轮播替换 {pc:content action="lists" catid="13" order="id DESC" num=" ...

  5. 如何让其他电脑访问到自己的Django项目

    1.首先修改setting.py文件 ALLOWED_HOSTS = ['*'] 2.运行时使用该命令 python3 manage.py runserver 0:8000 备注:如果上* 为固定的i ...

  6. Django框架详细介绍---模板系统

    Django模板系统 官方文档: https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatetag-for 1 ...

  7. flask 定义数据库关系(多对多)

    多对多 我们使用学生和老师来演示多对多关系:每个学生有多个老师,每个老师有多个学生.多对多关系示意图如下: 在实例程序中,Student类表示学生,Teacher类表示老师.在这两个模型之间建立多对多 ...

  8. Reading comprehension HDU - 4990

    Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024 ...

  9. 基本数据类型大总结(int,str,list,dict,tuple)

    python基本数据类型 int==>整数,主要用来进行数学运算 str==>字符串,可以保存单一数值 bool==>判断真假,true,false list==>存储大量数据 ...

  10. iOS开发 -------- AFNetworking实现简单的断点下载

    一 实现如下效果   二 实现代码 // // ViewController.m // AFNetworking实现断点下载 // // Created by lovestarfish on 15/1 ...