基于VBA技术实现调查问卷数据自动读取
2014-10-14韩爱庆
唐 燕,韩爱庆,翟 兴
(北京中医药大学信息中心,北京 100029)
0 引言
在日常工作和生活中,随着计算机的普及和各行各业信息化程度的不断提高,经常会有各种各样的调查问卷电子文档需要大家填写,当调查问卷的主办方收集到这些大量的文档后,如何将有价值的信息从每个文档中提取出来,并汇总在数据库或电子表格中就变得非常重要;类似地,企事业单位的人事处、财务处、科研处等部门也经常要求大家填写各种给定格式的文档,这些部门收集到员工们填写的文档后,也经常需要从这些文档中提取相关的信息并汇总统计数据。这样的应用非常广泛,也很普遍。然而,目前缺乏现成的工具或软件去自动获取收集到的文档中的信息,往往都是靠手工完成的,效率非常低下,还很容易出错。笔者在实际应用中,使用VBA编程,实现了将大量Word文档中的信息快速自动读取到Excel中的功能。
1 问题的描述
学校的人事处向全校教师下发了一份Word格式调查问卷,调查的内容涉及教师的个人信息、参加项目、发表论文以及教学工作量的情况。调查问卷的部分内容如图1所示。
图1 一份调查问卷的部分内容
在这份调查问卷中,有文字描述也有很多张表格。人事处收集到所有教师填写的Word文档后,需要将每个人在这些文档中填写的个人信息、课题、论文等方面的情况汇总在一个数据库或Excel电子表格中,以方便进一步统计分析。如果采用人工提取数据的方法,需要打开每份调查问卷,逐项复制,这样,不但花费大量的时间,而且工作效率非常低下,并且操作者也会感到枯燥繁琐,稍不留神,还很容易出错。笔者采用的方法是在Excel中使用VBA编写程序,自动扫描每份调查问卷文档,在分秒间即可完成所有问卷的数据自动读取。这种方法,节省了大量的人力和时间,效率很高,值得借鉴。
2 VBA技术
VBA(Visual Basic for Applications)是新一代标准宏语言,是基于Visual Basic for Windows发展而来的,是Visual Basic程序设计语言的子集。与VB不同的是VBA要求有一个宿主应用程序才能运行,比如Excel、Word等,不能用于创建独立应用程序。正因为这样,VBA在执行过程中与宿主应用程序紧密结合,不需要运用其它工具即可创建功能强大的个性化桌面应用程序。和其它编程语言一样,VBA中也有常用数据类型、结构体、数组、流程控制、函数等编程基本元素。在Word、Excel等Office软件中都可以利用VBA进行二次开发,从而改进Office应用程序的功能,使得Office软件能根据用户的需求实现更多的功能。
3 基于VBA的解决方法
笔者在Excel中,使用VBA编程,将同一目录下的所有Word文档逐一打开,提取需要的信息,并将信息显示在Excel中。通过程序自动读取数据,可以快速将大量的Word文档中的数据读取并整合在Excel中。在Excel中,利用其强大的数据处理能力,可以进行进一步的数据分析与统计。
3.1 解决问题的思路
当收集到Word版本的调查问卷时,将所有的文档放在同一个文件夹里。文件的组织如图2所示。
图2 Word文件组织结构
创建Excel文件,分多个Sheet存储数据。根据Word文档中不同主题的调查数据,创建不同的Sheet,并为每个Sheet创建由多个字段组成的表的基本结构。其中,字段需要从调查表中提取关键信息,一个Sheet中,可以有多个字段组成表头。根据这份调查问卷的内容,Excel文件的结构如图3所示。
图3 Excel文件的结构
在Excel中,添加按钮,编写按钮的单击事件,实现所有Word文档的数据提取。
3.2 算法的描述
算法中将Word文档中的内容分成2个部分,一部分是以回车结束的各段的文本描述信息的读取,另一部分是以表格形式展示的各张表格数据的读取。算法中将文本描述信息放置在Excel中的第一个Sheet中,并命名为个人信息;其余各张表格的数据分别放在不同的Sheet中,分别命名为工作情况、项目情况、论文情况、教学工作量。
(1)定义字符串变量 strFileName=Dir(This-Workbook.Path & "* .doc"),当 Len(strFileName)>0时,进入循环。定义Word文档obDoc=appWD.Documents.Open(ThisWorkbook.Path & "" & str-FileName)并获得要打开的Word的文件名。
(2)文本描述信息行数i=1,当i≤5时,开始循环,strSel=obSel.Paragraphs(1).Range.Text选择信息所在段落,strSel=Trim(Mid(strSel,InStr(strSel,":")+1))提取信息,sht.Cells(iRow,Chr(i+97))=strSel将信息写入第一个Sheet中的单元格中。循环结束,文字描述信息部分提取完毕。
(3)Word文档中的表格数 iTableCount=1,当iTableCount≤obDoc.Tables.Count,遍历 Word 中的所有表格。
(4)每张表格的行数 i=2,当 i≤tbl.Rows.Count时,从第二行开始遍历,如果 Len(Trim(tbl.Cell(i,1).Range.Text))>2,则 tbl.Rows(i).Select选择该行,obSel.Copy复制该行内容,sht.Cells(iRow,"b").PasteSpecial Paste:=xlPasteValues将选中的内容粘贴到Excel单元格中,iRow=iRow+1。返回第(4)步继续循环,否则,当 i> tbl.Rows.Count时退出循环。
(5)返回第(3)步继续循环,否则,当iTableCount>obDoc.Tables.Count时,所有表格的内容被读出,循环结束。
(6)关闭当前的Word文档,获得下一个Word文档名,返回第(1)步,继续循环,否则,当 Len(str-FileName)=0时,结束循环。
3.3 算法实现及主程序
下面,通过对Excel中的读取数据按钮添加单击事件,实现算法。具体代码如下所示:
以上程序是针对图1所示的调查问卷编写的,要正常运行,必须在Excel中准备好Sheet名称和每个Sheet中的表头。如果调查问卷的形式、内容发生了变化,需要修改程序中的Sheet名称数组、个人信息数组和部分程序。在 Excel中还需要建立对应的Sheet和每个Sheet的表头。也就是说,根据Word文档的不同,只需稍作修改,程序即可适用。
4 结束语
本文介绍了VBA编程技术,并利用VBA技术解决在大量的调查问卷Word文档中自动读取数据到Excel文件的方法。这种方法可以用在其它类似的文档统计分析中。扩展这项技术,也可以将Word格式文档中的信息自动读取数据到Access数据库中。通过运行自动读取程序,可以实现迅速自动获取大量分散在各文件中的数据,极大地提高了相关领域的工作效率,有效地降低了工作强度,值得推广。
[1]彭小平,颜清.Word中基于VBA的实验数据自动转换技术[J].计算机与现代化,2006(4):7-8,23.
[2]孙晓伟,毕晓清,吴洪越,等.基于DOM和VBA的Word文档数据交互式抽取[J].计算机应用与软件,2013,30(2):113-115.
[3]John Paul Mueller.VBA for Dummies[M].Wiley Publishing,2007.
[4]廖金辉,邓胜军.Excel工作表与Word表格的数据交换[J].信息技术,2006,30(5):20-23.
[5]韩爱庆,马星光,张未未,等.基于VBA的Word格式转为Unicode格式的方法[J].计算机与现代化,2013(9):236-238.
[6]林宫.基于OLE和VBA的数据库与Word数据交互研究[J].福州大学学报:自然科学版,2006,34(6):831-835.
[7]Microsoft.Office for Developers[EB/OL].http://msdn.microsoft.com/en-us/office/,2013-09-30.
[8]Excel Home.Excel应用大全[M].北京:人民邮电出版社,2008:785-809.
[9]顾海花.VBA在Word和Excel数据交互中的应用[J].南通职业大学学报,2003,17(3):49-50.
[10]王殿佑.Word VBA应用程序在处理文档未知重复内容中的应用[J].电脑编程技巧与维护,2010(2):19-20.
[11]杨晓亮.Word VBA高效排版范例应用[M].北京:中国青年出版社,2005.
[12]范晓燕,周涛峰.利用VBA实现Word文档的批量拆分与合并[J].电脑知识与技术,2011,7(7):1554-1556.
[13]汤怀.基于VBA技术的Word智能评分的设计与实现[J].福建电脑,2011,27(6):117-118,156.
[14]杨晓云,赵希武.基于VBA学位论文格式模板的设计[J].太原大学教育学院学报,2012,30(3):88-91.