[摘要] 本文介绍如何使用VBA开发通用型Excel数据抽取和汇总工具,从格式相同内容不同的多份Excel表单中抽取部分或者全部数据并自动汇总到Excel文件中,以方便后续统计分析工作。
[关键词] Excel; VBA; 表单; 数据抽取; 汇总
1背景介绍
在日常工作中,经常会遇到从多份格式相同但内容不同的Excel表单中抽取部分或者全部数据到一个Excel文件中,以便进行统计分析工作,如调查表汇总统计、实验报告汇总统计和监测数据汇总统计等。如果表单份数和内容较少、格式简单、时间富裕、准确率要求不高,可以采用人工抽取数据并汇总的方式完成工作。但如果表单份数和内容非常多、格式复杂、时间紧迫、准确率要求高,采用人工抽取数据并汇总的方式将无法在短时间内准确完成工作。因此,如何准确、快速地从Excel表单中抽取数据并汇总是数据处理工作中的一个难题。
VBA(Visual Basic For Application)是Office内嵌的应用开发工具,基于VBA开发的应用程序可以实现一些有规律的、重复性的工作,以替代手工工作方式,提高工作效率和准确率。本文将介绍如何使用VBA开发数据抽取与汇总工具,实现从格式相同、内容不同的多份Excel表单中自动抽取部分或全部数据并汇总到一个Excel文件中。
2设计思想
使用VBA开发的Excel数据抽取与汇总工具的目标是将多份格式相同、内容不同的Excel表单中的部分或者全部数据自动抽取并汇总到一个Excel文件中,以方便后续的统计分析工作。该工具具有通用性和灵活性两个主要特点。通用性:该工具适用于所有格式相同内容不同的Excel表单,使用者通过前端展示页面配置数据汇总模板中的参数,使该工具适应新的数据抽取和汇总要求,而不需要改动程序。灵活性:该工具可以让使用者根据工作需要自由抽取表单中的数据项,可以部分抽取也可以全部抽取,灵活自由。为此,程序需要解决以下3方面问题:① 判断需要抽取数据的Excel目标文件。② 判断从每个Excel文件的Sheet表单中需要抽取哪些数据。③ 设置怎样的循环才能将目标文件所有Sheet表单中的数据抽取并汇总到一个Excel文件中。
为了解决上述问题,该工具使用Excel作为前端展示页面,通过可配置的程序参数,实现操作简便、自由灵活、可重复使用的数据抽取与汇总功能。其中,程序参数包括:
(1) 目标文件的存储路径:程序根据该参数查找目标文件,并将目标文件列表保存在前端展示页面的指定位置。
(2) 待抽取数据的存储位置:程序根据该参数在目标文件中定位,并从中抽取数据。
(3) 结果文件的保存路径和名称:程序根据该参数将结果文件存储在指定路径下,并以约定的方式为其命名。
3功能实现
基于VBA的Excel 数据抽取与汇总工具主要由3个功能模块组成,即目标文件列表读取功能模块、数据抽取与汇总功能模块和生成结果文件功能模块。
3.1目标文件列表读取功能模块
目标文件列表读取功能是根据设定的路径将所有Excel目标文件读取出来,并将文件名显示在前端展示页面的指定位置,形成目标文件列表,以方便使用者检查核对。该功能模块的关键是设置正确的循环关系,以便将路径参数下所有目录中的Excel目标文件读取出来。该功能的核心代码如下:
Private Sub ReadFileList_Click()
Dim mFilePath As String
mFilePath = Range("用于存储路径位置").Value
ChDir (mFilePath)
ChDrive Left(mFilePath, 1)
If Right(mFilePath, 1) <> "\" Then
mFilePath = mFilePath & "\*.xls"
Else
mFilePath = mFilePath & "*.xls"
End If
Dim mNextRow As Integer
mNextRow = 目标文件列表所在的行数
Dim mFileName As String
mFileName = Dir(mFilePath, vbNormal)
Do While mFileName <> ""
Range("目标文件列表所在列" & mNextRow).Value = mFileName
mFileName = Dir
mNextRow = mNextRow + 1
Loop
End Sub
3.2数据抽取与汇总功能模块
数据抽取功能模块是根据配置参数在Excel目标文件的指定位置抽取数据,并以行记录的形式将数据保存到结果文件中。该功能的关键有两个部分:① 首先建立两个数组,分别用于存储数据汇总模板中的数据项目名称和数据存储位置,然后通过循环将配置参数依次读取到数组中,并将数据项目名称保存到结果文件对应Sheet表单中的第一行。② 设计3层嵌套循环,将所有Excel目标文件的所有Sheet表单中的待抽取数据项依次抽取并汇总出来。第1层是目标文件列表循环,逐项打开目标文件列表中的文件;第2层是文件内的Sheet表单循环,逐项打开目标文件中的每个Sheet表单;第3层是待抽取的数据循环,根据配置参数逐项读取目标数据,并将其保存到结果文件对应的Sheet表单中。该功能的核心代码如下:
(1) 建立两个数组,保存数据汇总模板中的数据项目名称和数据存储位置。
Do While mTempcolumnNumber <= (mColumnNumber - 2)
mInfo(mTempcolumnNumber - 1) = Cells(RowIndex:=mRowNumber, columnindex:=mTempcolumnNumber + 2).Value
mSourceInfo(mTempcolumnNumber - 1) = Cells(RowIndex:=mRowNumber + 1, columnindex:=mTempcolumnNumber + 2).Value
Workbooks(mSaveFileName).Worksheets(mTime). Cells(RowIndex:=1, columnindex:=mTempcolumnNumber) = mInfo(mTempcolumnNumber - 1)
mTempcolumnNumber = mTempcolumnNumber + 1
Loop
(2) 建立3层嵌套循环,抽取目标数据并保存。
Do While mSourceFileName1 <> ""
Workbooks.Open FileName:=mSourceFileName1
mSheetNumber = Workbooks(mSourceFileName1).Worksheets.Count
Do While mSheetTempNumber <= mSheetNumber
mInfoNumber = 0
Do While mInfoNumber < mColumnNumber - 2
mInfo(mInfoNumber) = Workbooks(mSourceFileName1).Worksheets(mSheetTempNumber). Range(mSourceInfo(mInfoNumber))
Workbooks(mSaveFileName).Worksheets(mTime).Cells(RowIndex:=mSaveRowNumber, columnindex:=mInfoNumber + 1) = mInfo(mInfoNumber)
mInfoNumber = mInfoNumber + 1
Loop
mInfo(mTempcolumnNumber) = Workbooks(mSourceFileName1).Worksheets(mSheetTempNumber).Name
mInfo(mTempcolumnNumber - 1) = Workbooks(mSourceFileName1).Name
mSaveRowNumber = mSaveRowNumber + 1
mSheetTempNumber = mSheetTempNumber + 1
Loop
Workbooks(mSourceFileName1).Close
mRowNumber = mRowNumber + 1
mSheetTempNumber = 1
mSourceFileName1 = Workbooks(mMainFileName).Worksheets(mMainSheetName).Cells(RowIndex:=mRowNumber, columnindex:=mSourceLinkColumnNumber).Value
Loop
3.3生成结果文件功能模块
生成结果文件功能模块在指定的路径下生成保存数据抽取与汇总结果的Excel文件或Sheet表单,并按照约定的方式为其命名。该功能的关键是判断指定路径下是否存在以当前日期命名的Excel文件,如果不存在,则新建一个Excel文件;如果存在则打开该文件,同时增加一个Sheet表单存储结果。为了在不修改程序的情况下可以同时存储多次抽取数据的文件而不相互干扰,程序规定以当前日期(yy-mm-dd)作为Excel文件的名称,以程序运行的时间(hh-mm-ss)作为存储结果的Sheet表单名称。该功能的核心代码如下:
If Dir(mFilePath & mSaveFileName) <> "" Then
Workbooks.Open FileName:=mSaveFileName
Workbooks(mSaveFileName).Worksheets.Add
Workbooks(mSaveFileName).Worksheets(1).Name = mTime
Else
mTemp = Workbooks.Count
Workbooks.Add
Workbooks(mTemp + 1).SaveAs FileName:=mSaveFileName, ConflictResolution:=xlLocalSessionChanges
Workbooks(mSaveFileName).Worksheets(1).Name = mTime
Workbooks(mSaveFileName).Worksheets(2).Delete
Workbooks(mSaveFileName).Worksheets(3).Delete
End If
4运行效果
下面以工作中的应用案例阐述使用数据抽取与汇总工具的主要步骤(见图1)和运行效果(见图2)。
(1) 配置数据汇总模板:使用者根据Excel表单内容,自由配置需要抽取的数据项名称和数据存储位置。其中数据项名称用于显示汇总表的表头信息,数据存储位置为表单中数据项的实际存储位置。
(2) 配置目标文件存储路径:正确填写Excel目标文件的存储路径。
(3) 读取目标文件列表:该工具根据目标文件存储路径,将该路径下的所有Excel文件读取出来,并以列表的形式展示在页面上。
(4) 数据抽取与汇总:上述步骤完成后,该工具根据参数将目标文件中的数据抽取出来并保存在结果文件中。
5结束语
在实际应用中,1 166个Excel文件,2 332个表单,102 608个数据项,使用该工具在内存为2.0GHz,硬盘转速为5 400转/秒的计算机上运行3分30秒左右,结果准确无误。
使用VBA开发的Excel数据抽取与汇总工具不仅具有投入成本低、简单易用、小巧灵活、可移植性好等特点,更重要的是通用性强。通过配置数据汇总模板,可适用于所有格式相同、内容不同的多份Excel表单的数据抽取与汇总工作,提高了工作效率和准确率。
主要参考文献
[1] Excel Home. Excel应用大全[M]. 北京:人民邮电出版社,2008.
[2] Excel Home. EXCEL数据处理与分析实战技巧精粹[M]. 北京:人民邮电出版社,2008.
[3] 黄海. Excel VBA语法与应用词典[M]. 北京:中国青年出版社,中国青年电子出版社,2009.
[4] 姚文涛. Excel VBA应用开发经典案例[M]. 北京:清华大学出版社, 2009.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文下载本文