Complicated Data Reference Based on VBA in Excel and Word
WANG Gui, SHI Xian
(Ertan Hydropower Development Company,Ltd. Ertan Hydropower Station, Panzhihua 617000, China)
Abstract:In the way of programing,how to cross-reference and integrate data in the commonly used Excel and Word with VBA languages in Office-based work item will be discussed, and analyze the important and difficult,then make achievement that complicated,repetitive daily work run automatically and improve the efficiency of work.
Key words: VBA programing; data reference; Excel; Word
在日常的Office办公中,经常出现标准命令无法满足用户需求或者标准命令的操作过程过于繁琐等方面的实际问题,VBA作为嵌入在Office套件中的程序开发语言,可以使Office应用程序得到扩展或者将Office应用程序及数据集成到其它应用程序中,解决用户的诸多难题,使得Office更加实用和智能化,从而提高用户的工作效率。
用户无论是在Excel中还是在Word中,建立和管理VBA都使用统一的方法和标准。Application是Excel、Word对象模型中最高级别的对象,表示Excel、Word程序自身[1]。Workbooks 、Worksheet 等又为Application对象,Excel应用程序在后台运行时,可以通过他们来访问具体的工作表等。Word VBA也提供了很多对象,在它的Application对象中有个Documents集合,其中包含每个打开文档的Document对象,利用这个对象可以访问任何打开的文档。Tables对象用来表示文档中的一个表格,Cell对象表示表格中的一个单元格[2]。
1 问题描述
某公司在每个月结束之后都要对该月每天以及全月的重要的生产数据进行统计和分析,所需数据格式样表如表1所示。该问题的复杂性在于表1中的数据来自不同的Excel报表和Word报表中,数据文件的结构如图1所示。由于该工作涉及文档繁多,数据量庞大,每次依靠人工抄写和统计都耗费大量的人力和时间,工作繁琐重复,且经常难以保证数据的正确性,本文就针对这个复杂问题,讨论在Office中利用VBA编程如何实现自动提取和生成所有数据的功能。
2 VBA程序
2.1 程序准备
由上可知,我们需要做的是从Excel的角度用VBA程序来进行数据综合。要顺利读取各种所需要的数据,必须先做好一些准备工作:
准备一 定义变量
Dim strdir, strfl As String'定义地址变量为字符串变量。
Dim i As Integer'定义将用到的循环变量。
Dim axlApp As Excel.Application'将Axlapp指向Excel应用程序本身。
Dim axlBook As Excel.Workbook'将axlBook定义为工作薄类型。
Dim sheet,asheet As Excel.Worksheet '将sheet,asheet定义为工作表类型。
由于涉及到的工作薄、工作表、数据量巨大,所以我们必须要定义足够的变量来满足程序流程的要求,这将使得后续的程序语言组织起来较为灵活,提取数据的方法也可以多样。
准备二 计算当月的天数
Dim y,m,d,ds As Integer
Set asheet =ActiveWorkbook.Sheets(3)'将asheet指向当前工作薄的第三个工作表。
y=Year(asheet.Cells(3,1))
m=Month(asheet.Cells(3,1))
d=Day(asheet.Cells(3,1))
ds=DateSerial(y,m+1,1)-DateSerial(y,m,1)'计算当月天数ds。
For i=1 To ds-1
asheet.Cells(3+i,1)=asheet.Cells(3,1)+i '在第一列的中填入日期
Next
单元格cell(3,1)是第一个日期所在位置,如表1所示,上述程序通过year、month、day函数从该单元格中分别提取年、月、日的数据。DateSerial函数可以返回表示已指定年月日的Date值,DateSerial(y,m+1,1)的返回值即为次月1日date值,用它减去当月1日得date值即为当月的天数。For(……)Next循环的作用是在第一列中依次输出当月每天的日期值,如2011年2月,则日期一直到2011年2月28日。
以上一段程序的功能是,用户可根据实际需要自定义需要分析的月份,只需要在cell(3,1)中输入起始日期,如2011/02/01,程序就会自动识别日期,计算当月天数,并将日期依次写入写入第一列中。在后续的编程中,日期将是一个非常重要的数据地址标识,而且也会大量用到ds这个值。
准备三 定义数据文件所在地址
If (Right(ActiveWorkbook.Path,1)<>"\")
Then strdir=ActiveWorkbook.Path+"\"
Else strdir=ActiveWorkbook.Path
End If
以上一段If(…)Else…判断语句将strdir地址变量指向本报表所在的文件夹地址,在提取数据时,只要把所有数据文档都放到本报表所在的文件夹地址下即可对其进行识别,这样有利于对文档的统一管理和操作。
2.2 读取数据
2.2.1 读取A列数据
A列数据从Excel表格中获得,其名称格式为“yyyy年mm月dd日报表”:
Set axlApp=New Excel.Application '新建一个Excel.EXE的后台实例,专用来打开数据所在的工作薄。
Fori=0 To ds-1
strfl=strdir+"Excel报表\"+Format(ActiveWorkbook.Sheets(3).Cells(3,1)
+i,"yyyy")+"年"+Format(ActiveWorkbook.Sheets(3).Cells(3,1)+i,"mm")
+"月" +Format(ActiveWorkbook.Sheets(3).Cells(3,1)+i,"dd")+"日报表.xls"
Set axlBook=axlApp.Workbooks.Open(strfl)'打开报表。
Set sheet=axlBook.Worksheets("今日生产日报")'指向数据所在工作表。
ActiveWorkbook.Sheets(3).Cells(3+i,2)=sheet.Cells(38,27)'读取A列数据。
axlBook.Close(False)'关闭打开的报表。
Next
Format()在对时间进行格式化输出时的意义在于返回一定格式的字符串时间量,Format(date time,"####")表示将date time以####的格式输出。利用一个For(……)Next循环,随着整型变量i的变化,便可以将strfl这个变量指向与第一列日期相吻合的生产日报表。 (责任编辑:南粤论文中心)转贴于南粤论文中心: http://www.nylw.net(南粤论文中心__代写代发论文_毕业论文带写_广州职称论文代发_广州论文网)