用Excel VBA实现物业收据的打印

2018-01-06 12:35代远大钟鸣李建平
电脑知识与技术 2017年35期

代远大+钟鸣+李建平

摘要:以一览表形式逐行建立的数据记录,便于集中浏览。但在实际工作中,通常要以记录为单位,按预定的格式,进行独立页面打印输出。利用Excel VBA编写简单程序代码,可以轻松实现。

关键词:Excel VBA;数据一览表;物业收据;打印

中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2017)35-0227-02

当前,物业管理行业的收费名目繁多,收据格式五花八门,没有通用的收据打印软件。部分物业公司还在采用手工填写方式,劳神费时,容易出错;有的使用从网上下载的免费软件,感觉又不能满足公司的特殊需要,用起来不顺手。面对这种状况,如何利用现有应用软件,设计满足自身需要的物业收据打印系统,是一个值得探讨的问题。

1 需求分析

各物业小区业主收费信息,以一览表的形式分别存放在各个工作表中,每个业主的数据形成一行记录,需要实现以下功能:

可以按预定的格式,分别不同的物业小区,向前、向后逐个浏览各业主的物业费用信息,对显示的当前业主物业收据进行打印,对指定范围内的业主物业收据进行批量的、连续的打印。

2 开发环境

Microsoft Office Excel 2007中文版。

3 设计过程

1) 新建一个Excel2007工作簿文档,保存为启用宏的工作簿“Property.xlsm”。

2) 新建两个工作表,表标签名称分别以各物业小区名称命名,分别为“白鹤印象”、“蔚蓝天空”,用于存放两个物业小区收费信息,表列内容包含房号、姓名、水电气数据、物业费、其它等(如图1所示)。

3) 新建一个工作表,表标签名称为“收据打印”(如图2所示),用于浏览显示、打印输出预定格式物业收据。将工作表上部的B2:L11单元格区域设置为打印区域,下部的B12:L13 单元格区域为打印控制区,其内容不打印输出。

4) 对“收据打印“工作表物业小区后边的D4单元格进行数据有效性设置:在允许下拉列表框中选择“序列”,在来源下面的文本框中输入“白鹤印象,蔚蓝天空”。

5) 对“收据打印”工作表的相关单元格设置公式:

No. K3: =YEAR(TODAY())&MONTH(TODAY()) (将当前年月自动冠于收据编号前)

L3: =$F$12 (将当前记录号自动作为收据编号)

房号G4: =OFFSET(INDIRECT($D$4&"!A4"),$F$12,)

姓名J4:=OFFSET(INDIRECT(D4&"!B4"),$F$12,)

水表上月读数E6:=OFFSET(INDIRECT(D4&"!C4"),$F$12,)

电表上月读数E7:=OFFSET(INDIRECT(D4&"!F4"),$F$12,)

气表上月读数E8:=OFFSET(INDIRECT(D4&"!I4"),$F$12,)

水表本月读数G6:=OFFSET(INDIRECT(D4&"!D4"),$F$12,)

电表本月读数G7:=OFFSET(INDIRECT(D4&"!G4"),$F$12,)

气表本月读数G8:=OFFSET(INDIRECT(D4&"!J4"),$F$12,)

水实用数I6= =G6-E6

电实用数I7= =G7-E7

气实用数I8= =G8-E8

水单价K6: =OFFSET(INDIRECT(D4&"!E4"),$F$12,)

电单价K7: = OFFSET(INDIRECT(D4&"!H4"),$F$12,)

气单价K8: = =OFFSET(INDIRECT(D4&"!K4"),$F$12,)

水费L6: =ROUND(I6*K6,2)

电费L7: =ROUND(I7*K7,2)

氣费L8: =ROUND(I8*K8,2)

物业费E9: =OFFSET(INDIRECT(D4&"!L4"),$F$12,)

其他费I9:=OFFSET(INDIRECT(D4&"!M4"),$F$12,)

物业费与其他费小计L9: =E9+I9

收据总金额(小写)L10:=SUM(L6:L9)

收据总金额(大写)H10: =SUBSTITUTE(SUBSTITUTE(TEXT(TRUNC(FIXED(L10)),"[>0][dbnum2];[<0]负[dbnum2];;")&TEXT(RIGHT(FIXED(L10),2),"元[dbnum2]0角0分;;"&IF(ABS(L10)>1%,"元整",)),"零角",IF(ABS(L10)<1,,"零")),"零分","整")

制票日期F11:=YEAR(TODAY())&"年"&MONTH(TODAY())&"月"&DAY(TODAY())&"日"

6) 在“收据打印”工作表中添加一个数值控件(用于控制选择当前记录号),右击控件,在菜单中选择“设置控件格式”,在设置窗口中,将当前值、最小值、步长值均设置为1,最大值根据需要设为足够大的一个整数(以保证能控制各物业小区的最多业主数量),单元格链接为$F$12(与当前记录号单元格建立关联)。当按下控件的向上、向下箭头按钮时,当前记录号单元格$F$12值发生加1、减1的变化,引发与之相关的所有公式单元格的值发生变化,形成联动效应,从各物业信息工作表中适时获取对应的数据,显示在“收据打印”工作表的单元格中。endprint

7) 在”收据打印”工作表中添加两个按钮控件,标题分别为“打印当前页”、“打印指定页”

8) 为“打印当前页”按钮指定宏,名称为PrintCurPage_click,用VBA编写以下代码:

Sub PrintCurPage_Click()

n = MsgBox("确定打印当前业主收据吗?", vbOKCancel)

If n = vbOK Then ActiveSheet.PrintOut

End Sub

9) 为“打印指定页”按钮指定宏,名称为PrintRange_click,用VBA编写以下代码:

Sub PrintRange_Click()

startNum = Range("F13")

endNum = Range("H13")

'——-起始页员小于或等于终止页号时进行打印,否则提示错误信息后退出

If startNum <= endNum Then

n = MsgBox("确定打印第 " & startNum & "~" & endNum & " 页号吗?", vbOKCancel)

If n = vbOK Then

Range("F12") = startNum '——-将当前页号设置为指定的初始页号

'——-开始从指定页号到终止页号的循环打印

For i = startNum To endNum

ActiveSheet.PrintOut '——-打印当前记录

Range("F12") = Range("F12") + 1 '——-将下一记录转为当前记录

Next i

End If

Else

MsgBox "错误:起始页号应小于或等于终止页号,请重新输入!"

End If

End Sub

10) 将“收据打印”工作表中当前页号、指定页F12、F13、H13以外的全部单元格锁定,并对该工作表设置保护,防止对其它非编辑单元格(特别是打印区域单元格)的误操作。

4 运行测试

在“收据打印”工作表中,点击物业小区D4右边的下拉箭头,可以对物业小区进行切換显示。点按数值控件的向上、向下箭头,分别向前、向后翻页显示各业主的物业收据。接通打印机,点击“打印当前页”按钮,对当前业主的物业收据进行了正确的打印输出;输入起始记录号和终止记录号,点击“打印指定页”按钮,指定范围内的全部业主收据实现了批量的、连续的打印输出。运行测试正常,满足设计需求。

5 设计结论

在Excel工作表中,以一览表形式存储的数据记录,可以进行按预定格式的显示和打印输出。利用Excel VBA 编写简单的代码,可以轻松实现复杂逻辑操作过程的批处理,极大地提高工作效率。

参考文献:

[1] 黄海. Excel公式函数图表VBA一本通[M].北京:中国青年出版社,2008.

[2] 姚文涛.Excel VBA 应用开发经典实例[M].北京:清华大学出版社,2009.

[3] Excel Home. Excel2007应用大全[M].北京:人民邮电出版社,2012.endprint