使用VBA,優化處理Excel表格

前言

  上週末,XX給我抱怨:由於計算績效獎金,把2我的的工資發錯了,還被扣了500元。問的原因得知,她每月要處理十來個excel表格,每次都要手動修改裏面的值,若是修改了一處,其餘地方也要修改,而後還要多處地方覈對。致使光這件事情就要消耗三四天,傷神費力。git

我就問她,整個是否是都是機械性重複的工做,若是是的話,徹底能夠用電腦來代替。而後我就幫她找工具來優化她的工做,減小出錯機會。github

現狀

  1. 目前他們公司總共有四五十人;
  2. 須要整理的excel有12份;
  3. excel間有不少重複數據,一樣的數據存在在多分表中;
  4. excel之間相互引用數據很頻繁,雜亂,牽一髮而動全身。

兩種方案

  1. 使用HRM管理系統,在網上找到三套有源碼的軟件:
    • 僅僅在github上面找到一箇中文的系統 hrms(github大量英文系統)。--須要本身找服務器部署
    • 悟空HRM,PHP開源,文檔也比較詳細,中文。試用了一下在線版本,功能沒法知足需求,須要二次開發,同步須要服務器部署。
    • OrangeHRM,是阿里雲市場裏面,也須要購買服務器。

    總結:如今目前找到的都是web版的系統,都須要在線部署。沒有找到桌面版本,能夠當即使用的那種。都不太適合目前的狀況。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已經早就實現這個功能了。工具

相關文章
相關標籤/搜索