excel表格生成和公式设置十分强大便利,是一个强有力的信息分析与处理工具。visual basic是一套可视化、面向对象、事件驱动方式的结构化高级程序设计语言,正成为高效率的windows应用程序开发工具。 由于微软的努力,visual basic应用程序版可作为一种通用宏语言被所有微软可编程应用软件共享。
excel面始之初带有表格处理类软件中功能最强的宏语言,通过单击“工具”菜单中的“宏”,选择宏名来调用宏过程。随后发展至visual basic for application专用版,可制作按钮、复选框、单选钮等控件,赋控件以宏名,单击控件运行宏,事件驱动方式就click(单击)一种。新近推出的office97套件中的excel97,在“工具”菜单中选择“宏”后,就会发现增加了“visual basic编辑器”功能。运用这个新增功能,就完全与visual basic编程无异了。在菜单栏上单击鼠标右键,选择弹出式菜单中的“控件工具箱”,在“控件工具箱”工具条上,单击待添加的控件按钮,在工作表中将控件拖曳到所需位置和大小,单击鼠标右键选中“属性”设置控件属性后,双击控件就会出现visual basic编辑器。选择该控件的一个事件如click或change,编写程序。在工作表中操作该控件,如鼠标单击、键入字符等,则触发相应事件,执行相应程序。
笔者在excel97平台,采用visual basic应用程序版开发了一套“通用报表分析系统”。该系统用于拥有众多子公司的母公司的每月财务报表合并汇总。所有子公司的统计报表如资产负债表、损益表是由foxbase编制的财务软件生成的dbf文件,取名为atv001xx.dbf----xx月份资产负债表,atv002xx.dbf----xx月份损益表等。一个子公司的所有dbf文件放在一个单独的目录中,如c:\t\palm1,c:\t\palm2等。母公司每月份生成的汇总报表为tttyymm.xls(yy----年份,mm----月份),它有“资产负债表”、“损益表”等若干工作表组成。每张工作表是由所有子公司相应的dbf文件的相应项目的数据相加而成。只要将dbf文件逐一转化到tttyymm.xls中去,很容易利用excel的公式设置功能生成母公司的每张汇总报表。
这套系统的关键在于如何将所有dbf文件转换到同一个excel工作簿中。直接通过“文件”菜单中的“打开”项, 选择文件类型为dbase文件(*.dbf), 可将dbf文件转换到excel工作簿中,但这工作簿只存转换而来的一张工作表,其他表都自动关闭了。另外,通过“工具”菜单中的“向导”,选择“文件转换”后, 只是将一系列dbf文件转换为一系列xls文件而已。于是采用建立odbc数据源获取外部数据的办法, 将dbf文件逐一转换到一个excel工作簿内, 且用visual basic for application将转换过程自动化。只要按一下图1中的“生成报表”按钮, 就能完成所有dbf 文件的转换, 且利用excel公式自动计算功能完成所有报表的汇总计算。按“显示报表”按钮,选择表名,可以浏览报表数据。
具体的方法是:
一、 建立odbc数据源
(1) 打开“数据”菜单, 选择“获取外部数据”, 然后单击“新建查询”;
(2) 在“选择数据源”对话框中, 双击“<新数据源>”;
(3) 出现“创建新数据源”对话框,输入数据源名称, 选择驱动程序如microsoft dbase driver(*.dbf), 单击“连接”;
(4) 在“odbc dbase安装”对话框中, 单击“使用当前工作目录”前的复选框, 去掉缺省( , 单击“选定目录(s)”, 选择子公司存放dbf文件的目录如c:\t\palm1, 连按“确定”;
(5) 当出现microsoft quary对话框时, 单击“关闭”, 退出。不要理会出现的警示信息,因为此时只需建立数据源, 并不需要用microsoft query查询数据;
(6) 重复上述步骤, 在(4)中改换另一家子公司的目录, 就为另一家子公司建立一个数据源。必须建立所有子公司的数据源。
二、手动获取外部数据
(1) 单击“数据”,选取“获取外部数据”,单击“新建查询”;
(2) 出现“选取数据源”对话框,点中“使用查询向导创建/ 编辑查询”前的复选框,然后双击数据源名,如palm1;
(3) 在“查询向导——选择列”对话框中选择一个查询表名,单击 > 键,“查询中用到的列”框内会出现表中所有列名,单击“下一步”;
(4) 出现“查询向导——过滤数据”,单击“下一步”;
(5) 出现“查询向导——排序顺序”,单击“下一步”;
(6) 出现“查询向导——完成”,点中“将数据返回microsoft excel”前的单选钮,单击“完成”;
(7) 出现“将外部数据返回到excel”对话框,选中“新建工作表”,按“确定”;
(8) 在建立查询的工作簿内新建工作表,并放入转换好的数据。这样就将一个 dbf 文件转换好了。
(9)重复上述过程,所有子公司的dbf文件转换到同一个工作簿中。
三、 使用vb实现excel自动获取外部数据
(1) 进行手动获取外部数据(1)步骤前,单击“工具”菜单中的“宏”,选择“录制新宏”,在“宏名”的编辑框中键入宏名dbftoxls,按“确定”键;
(2) 完成手动获取外部数据(1)-(8)步骤;
(3) 单击“工具”菜单中的“宏”,选择“停止录制”。这样就将获取外部数据的过程记录为宏。
(4) 编辑dbftoxls宏,加以修改,使它作为visual basic模块表中的一个子程序,并设置调用参数。
提供的程序如下:
`设置初值
const apppath = "c:\my documents\palmxls\"
const modulefile = apppath + "module.xls"
const staticspre = "ttt"
const dbfpre = "atv00"
`调用dbftoxls的模块
private sub cmdgeneratetable_click()
dim staticsfile as string
dim s1 as string
dim s2 as string
dim s3 as string
dim idyes as integer
dim dbfstring as string
on error goto errhandler1
idyes = 6
s1 = txtyear.text
s1 = mid(s1, 3, 2)
s2 = txtmonth.text
if len(s2) = 1 then
s2 = "0" + s2
end if
staticsfile = apppath + staticspre + s1 + s2 + ".xls"
if filelen(staticsfile) > 0 then
choice = msgbox("该年月报表已存在,是否重新生成?", vbyesno + vbexclamation + vbdefaultbutton1, "")
if choice = idyes then
workbooks.open filename:=staticsfile
for i = 0 to companynum - 1
for j = 0 to tablenum - 1
dbfstring = dbfpre + trim(str$(j + 1)) + s2
sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j))
call dbftoxls(s(i, j), sqlstring)
next j
next i
activeworkbook.save
activeworkbook.close
end if
end if
exit sub
errhandler1:
select case err
case 53
workbooks.open filename:=modulefile
s3 = s1 + "年" + s2 + "月"
sheets("资产负债表").range("e4").formular1c1 = "'" + s3
activeworkbook.saveas filename:=staticsfile, fileformat _
:=xlnormal, password:="", writerespassword:="", readonlyrecommended:= _
false, createbackup:=false
for i = 0 to companynum - 1
for j = 0 to tablenum - 1
dbfstring = dbfpre + trim(str$(j + 1)) + s2
sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j))
call dbftoxls(s(i, j), sqlstring)
next j
next i
activeworkbook.save
activeworkbook.close
end select
end sub
`dbftoxls子程序
sub dbftoxls(activesheetname, sqlstring)
sheets(activesheetname).activate
cells.select
selection.clear
range("a1").select
with activesheet.querytables.add(connection:=array(array( _
"odbc;collatingsequence=ascii;dbq=c:\t\palm1;defaultdir=c:\t
\palm1;deleted=1;driver={microsoft dbase driver (*.dbf)};driverid=533;fil" _
), array( _
"=dbase iii;implicitcommitsync=yes;maxbuffersize=512;maxscanrows=
8;pagetimeout=600;safetransactions=0;statistics=0;threads=3;use" _
), array("rcommitsync=yes;")), destination:=range("a1"))
.sql = array( sqlstring)
.fieldnames = true
.refreshstyle = xlinsertdeletecells
.rownumbers = false
.filladjacentformulas = false
.refreshonfileopen = false
.hasautoformat = true
.backgroundquery = true
.tablesonlyfromhtml = true
.refresh backgroundquery:=false
.savepassword = true
.savedata = true
end with
end sub
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器