视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用 VBA实现Excel表单数据的自动抽取与汇总
2025-10-03 14:36:28 责编:小OO
文档
使用 VBA实现Excel表单数据的自动抽取与汇总

[摘要] 本文介绍如何使用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格式阅读原文下载本文

显示全文
专题