VBA、EXCEL和ORACLE数据库的联合编程

VBA、EXCEL和ORACLE数据库的联合编程

荣县新型农村合作医疗服务中心刘毅

摘要本文介绍了用VBA作为开发语言,用ORACLE作为数据库, 用EXCEL来保存数据库查询得到的结果,并用VBA将数据调用到打印表格中打印成票据的例子,并给出了源程序。

关键词 VBA EXCEL ORACLE 联合编程

在本人的实际工作中,每天都要手工开写大量的补助结算单票据,工作量相当大。就利用自己所学的知识,将审核人员录入的数据导出到EXCEL中,再利用VBA设计将导出的数据输入进指定的单元格,最后打印到一式三联的补助结算单中。

实现方法

一、首先,将下图的单据格式设置到EXCEL中

1、先将结算单的第一联用扫描仪扫描为分辨率为100dpi的图片。

2、将此图片设置为第一个工作表的背景,单击“格式/工作表/背景”,在弹出的对话框中,选择插入刚扫描的补助结算单的图片。再单击“视图/显示比例/自定义”,将显示比例调整为106。

3、将此工作表中所有“年月日”前面的单元格格式设为文本,医疗证号后面的单元格也设为文本格式,将大写金额一栏中的相应单元格的格式设为“特殊”中的“中文大写数字”。

4、通过拖动行、列标题的边界调整行高列宽,再配合使用格式工具栏中的“合并及居中”按钮,让支票中要每个要填写的位置均正好与一个单元格重合。调整好页面设置,使需要打印的内容能打印在合适的位置,并命名工作表标签的名字为“打印表”。

二、建立与数据库的连接。

与数据库的连接有两种方法:一种是利用ODBC与ORACLE数据库进行连接,另一种是在VBA中利用ADODB方法与ORACLE数据库进行连接。本文在这里只介绍利用ODBC与ORACLE数据库进行连接。步骤为:

1、单击“开始/控制面板/管理工具/数据源(ODBC)”。

2、在弹出来的窗口中,选择用户DSN的标签,点击右边的添加。如下图:

3、在弹出的添加对话框中选择以oracle开头的驱动程序(因为ORACLE数据库的版本不一,oracle 后面的字符串也不一样)。

4、配置好ODBC驱动配置。在弹出的对话框中,依次输入Data Source Name(数据源名称),Description (描述),TNS Service Name(oracle服务名),User ID(用户名)后完成连接配置。如下图:

三、安装微软查询器。

插入以前安装office软件的光盘,点击setup.exe后,在弹出的对话框中,选择添加或删除功能,在下一对话框中,将“选择应用程序的高级自定义”打上勾,在接下来的窗口中,展开“office工具”,选中“Microsoft Query”后,点击更新即可。

四、从ORACL数据库中导出数据到EXCEL。

在EXCEL中,打开第二个工作表,并命名为“查询”。在查询工作表中,选中要保存导出数据的起始单元格,单击“数据/导入外部数据/新建数据库查询”,在弹出的“选择数据源”对话框中,双击在第2步建立的数据源名称,在弹出的对话框中,输入用户的密码,可随便选取一个表,在接下来的几个步骤中选取默认选项。在最后一个步骤中,选取“在Microsoft Query中查看或编辑查询”,并点击完成。

在弹出的查询器窗口中(即下图),点击“SQL”按钮。

并输入自己想要查询数据的SQL语言。

输入SQL语句确定后,就可得到查询结果:

点击按钮,将数据返回到EXCEL中。如下图。

五、保存数据库查询的密码,数据库中的数据一改,即可刷新数据保持一致。

在上图中有数据的地方选中任一活动单元格,单击“数据/导入外部数据/数据区域属性”,将“保存密码”打上勾并确定。以后刷新数据时,就省去了每次都要输入密码。刷新数据时,单击“数据/刷新数据”,就可使此表中的数据保持与数据库在的数据一致。

六、利用VBA将导出的数据输入到打印工作表打印出来。

设计思路:审核人员每录入一人次的医疗补助费用明细,就在查询工作表中将人员补助信息刷新出来,利用VBA将最后一行的数据输入到打印工作表中,并转到打印工作表中,再打印在纸质补助结算单上。

建立宏:在EXCEL中,单击“工具/宏/宏”,在弹出的对话框中(如下图),在宏名一栏中输入打印“打印数据”,再点击创建。创建后,在弹出的窗口中输入VBA语句并保存。为使操作更方便,可设置快捷键:单击“工具/宏/宏”,并点击选项,在选项中设置快捷捷为Ctrl+K(不会覆盖系统中其它快捷键)

源程序清单

Sub 打印数据()

Dim i,j As Integer

i = Worksheets.Count '工作表数目统计

Worksheets(i).Select '选择最后一个工作表,默认查询工作表在最后

j = Worksheets(i).UsedRange.Rows.Count '统计最后一个工作表即查询工作表中的行数Worksheets(i).Cells(j, 20) = date '记录报帐当天日期

'以下16行将查询工作表中最后一行的数据,即一人的住院补助信息输入到第一个工作表打印工作表中Worksheets(1).Cells(3, 3) = Worksheets(i).Cells(j, 6)

Worksheets(1).Cells(4, 2) = Worksheets(i).Cells(j, 13)

Worksheets(1).Cells(4, 6) = Mid(Worksheets(i).Cells(j, 3), 1, 18) '提取医疗证号

'以下6行将分别提取入出院的年、月、日信息

Worksheets(1).Cells(4, 15) = Mid(Worksheets(i).Cells(j, 15), 3, 2)

Worksheets(1).Cells(4, 19) = Month(Worksheets(i).Cells(j, 15))

Worksheets(1).Cells(4, 21) = Day(Worksheets(i).Cells(j, 15))

Worksheets(1).Cells(4, 26) = Mid(Worksheets(i).Cells(j, 16), 3, 2)

Worksheets(1).Cells(4, 28) = Month(Worksheets(i).Cells(j, 16))

Worksheets(1).Cells(4, 30) = Day(Worksheets(i).Cells(j, 16))

Worksheets(1).Cells(5, 4) = Worksheets(i).Cells(j, 4)

Worksheets(1).Cells(5, 10) = Worksheets(i).Cells(j, 5)

Worksheets(1).Cells(9, 1) = Worksheets(i).Cells(j, 7)'

Worksheets(1).Cells(9, 4) = Worksheets(i).Cells(j, 8)

Worksheets(1).Cells(9, 7) = Worksheets(i).Cells(j, 11)

Worksheets(1).Cells(9, 9) = Worksheets(i).Cells(j, 14)

Worksheets(1).Cells(9, 16) = Worksheets(i).Cells(j, 12)

y = Worksheets(i).Cells(j, 12)

'下面的Select Case语句将小写的补助金额转换为单个的万、千、百、十、元、角、分的小写数字,再利用步骤一中设定的单元格格式显示为中文大写数字。

Select Case y

Case 20000

Worksheets(1).Cells(10, 7) = 2

Worksheets(1).Cells(10, 9) = 0

Worksheets(1).Cells(10, 12) = 0

Worksheets(1).Cells(10, 18) = 0

Worksheets(1).Cells(10, 22) = 0

Worksheets(1).Cells(10, 25) = 0

Case 10000 To 20000

Worksheets(1).Cells(10, 7) = 1

Worksheets(1).Cells(10, 9) = Int(y / 1000) - Int(y / 10000) * 10

Worksheets(1).Cells(10, 12) = Int(y / 100) - Int(y / 1000) * 10

Worksheets(1).Cells(10, 18) = Int(y / 10) - Int(y / 100) * 10

Worksheets(1).Cells(10, 22) = Int(y - Int(y / 10) * 10)

Worksheets(1).Cells(10, 25) = Int(y * 10 - Int(y) * 10)

Case 10000

Worksheets(1).Cells(10, 7) = 1

Worksheets(1).Cells(10, 9) = 0

Worksheets(1).Cells(10, 12) = 0

Worksheets(1).Cells(10, 18) = 0

Worksheets(1).Cells(10, 22) = 0

Worksheets(1).Cells(10, 25) = 0

Case 1000 To 9999

Worksheets(1).Cells(10, 7) = 0

Worksheets(1).Cells(10, 9) = Int(y / 1000)

Worksheets(1).Cells(10, 12) = Int(y / 100) - Int(y / 1000) * 10

Worksheets(1).Cells(10, 18) = Int(y / 10) - Int(y / 100) * 10

Worksheets(1).Cells(10, 22) = Int(y - Int(y / 10) * 10) Worksheets(1).Cells(10, 25) = Int(y * 10 - Int(y) * 10)

Case 100 To 999

Worksheets(1).Cells(10, 7) = 0

Worksheets(1).Cells(10, 9) = 0

Worksheets(1).Cells(10, 12) = Int(y / 100) - Int(y / 1000) * 10 Worksheets(1).Cells(10, 18) = Int(y / 10) - Int(y / 100) * 10 Worksheets(1).Cells(10, 22) = Int(y - Int(y / 10) * 10) Worksheets(1).Cells(10, 25) = Int(y * 10 - Int(y) * 10)

Case 10 To 99

Worksheets(1).Cells(10, 7) = 0

Worksheets(1).Cells(10, 9) = 0

Worksheets(1).Cells(10, 12) = 0

Worksheets(1).Cells(10, 18) = Int(y / 10) - Int(y / 100) * 10 Worksheets(1).Cells(10, 22) = Int(y - Int(y / 10) * 10) Worksheets(1).Cells(10, 25) = Int(y * 10 - Int(y) * 10)

Case 1 To 9

Worksheets(1).Cells(10, 7) = 0

Worksheets(1).Cells(10, 9) = 0

Worksheets(1).Cells(10, 12) = 0

Worksheets(1).Cells(10, 18) = 0

Worksheets(1).Cells(10, 22) = Int(y - Int(y / 10) * 10) Worksheets(1).Cells(10, 25) = Int(y * 10 - Int(y) * 10)

End Select

s = Date '以下3行将在打印工作表中显示当天日期的年、月、日。Worksheets(1).Cells(11, 25) = Mid(s, 3, 2)

Worksheets(1).Cells(11, 27) = Month(s)

Worksheets(1).Cells(11, 29) = Day(s)

Worksheets(1).Select

End Sub

按Ctrl+K运行后,得到的效果图为:

相关文档
最新文档