本帖最后由 bjfuowl 于 2016-11-17 01:04 编辑
零基础零VBA完美解决发票类套打问题 2016.11.16
懒惰是推动社会发展进步最重要的动因 --------不知道谁说的
一、写在最前面 1、感谢论坛里的各种帖子和大神的指导,让我完美解决了套打; 2、我只是个搬运工,思路想法都是大家的; 3、在这里只是记录自己的开发过程,留个纪念,不打算上传文件; 4、其实我做的非常麻烦,VBA的话应该就几句就可以了吧,原谅我不会编程,大神们勿喷,小白们会看的很舒心; 5、开发环境是Windows_10_Enterprise_2016_LTSB_x64 &OFFICE_2016&EPSON_DLQ_3250K 二、最终实现的各种功能 1、从原来的手写五联单升级到针式打印机机打; 2、从另一个数据库列表中一键引用数据。 #传说中的五联单# 三、打印模板的制作 1、把手写票据变成照片或者扫描文件; 2、用图片处理类软件将图片设置成1:1大小; 3、将图片设置成EXCEL背景; 4、各种调整,让格子都对上; 5、设置打印区域,并只显示打印区域;
6、试印,并不断调试,直到完美。 但实际上,由于种种原因,步骤2无法实现,只能手工调整,但有背景参考可以画出大致位置,微调几次就可以了。 我是直接设置A4纸打印,并固定票据进纸位置,需要多尝试几次。
#打印模板#
#打印效果# 四、逐步实现套打 打印效果还算比较完美,比以前手写强多了,但每次还要输入好多数字什么的,还是比较繁琐,所以需要实现能引用数据,实现套打。 (一)、确定核心数据,建立数据列表 只有四个数据是原始数据,其他都能计算得出。四个数据分别是“填制日期”、“编号”、“相对人”、“小写金额”。加一列序号,完成制表。(需创建表,方便添加数据)
#原始数据表# (二)、计算各种数据 1、缴款期限为填制日期起十五日内,设置好单元格格式后(设置为日期),则公式为 缴款期限=填制日期+15 当事人应当自收到行政处罚决定书之日起十五日内,到指定的银行缴纳罚款。银行应当收受罚款,并将罚款直接上缴国库。 ---《行政处罚法》第四十六条第三款 2、日期的年月日都是分开的,需要公式 年=Year(日期) 月=Month(日期) 日=Day(日期)
3、有的日期需要中文小写,可利用公式 大写月=Text(月,”[dbnum1]”) Text(value,format_text)公式的含义就是,将数值转换成相应的文字格式,[dbnum1]为中文小写格式,[dbnum2]为中文大写格式,这个我们一会也会用到。 测试发现,存在BUG,比如“2016”会变成“二千零一十六”,“11”会变成“一十一”,需要用提取文字的公式进行改正。月份只有公式如下: “十一”=Right(“一十一”,2) Right(text,[num_chars])公式的含义就是,从右边数,提取几位的字符。年份的提取原理也是这样,但可考虑到四位数的复杂性,故放弃。 4、金额的大写和拆分 金额大写可利用Text()公式转换。 因为我只用到千位而且都是整百的数值,我只需要提取2个位数上的值,其他都不用变化,其实原理是一样的,不过巨麻烦。
#让人吐血的办法# 百位数比较好提取,因为默认是3位或者4位整数,则可先提取后3位然后在提取第一位。 金额百位= Left(Right(小写金额,3),1) Left(text,[num_chars])公式同Right()类似,是指从左边数,提取几位。 千位数存在一个问题就是,如果金额为百位数,千位数需要用符号进行占位,则需要我们对金额进行判定。需要用到If ()和Len()两个函数。 If(logical_test,[value_if_ture],[ value_if_false])是给出一个逻辑条件,真或假会给出不同的数值。 Len(text)是返回文本字符串中的字符个数。 因此千位小数的公式为 金额千位=If(Len(小写金额)=4,Left(小写金额,1),"¥") 大写的百位和千位,公式同理。 大写百位=Text(金额百位,"[dbnum2]") 大写千位=If(金额千位="¥","Ⓧ",TEXT(金额千位],"[dbnum2]"))
“¥”和“Ⓧ”怎么输入? (“¥”符号到底是一横还是两横?,反正我默认为两横了,忽略日元) 其实还有一种简便的输入“¥”,按住“Alt键”不放,在小键盘中连续输入“0165”,OK。 如果没有Arial Unicode MS字体的话还是需要下载一个的。 (三)、引用数据到打印模板 某大神的帖子让我眼前一亮,可以利用表单控件和VLOOKUP()函数实现逐条引用。
Vlookup函数算是稍微高级一点的函数了,公式格式是这样的,Vlookup(选定的值,搜索范围,相对于选定值的列数,false)。这样数据表的第一列序号和表单控件手动控制的打印模板的序号完美重合,可以实现引用。 1、以日期月份公式为例,公式如下: 月份=Vlookup(信息表序号,信息表区域,第几列,false) 其他各个数据公式需一一对应编写,工作量很大。 2、处罚决定书编号是典型的文本加公式模式,公式为: 处罚编号="XXXXX[2016]460"&编号单元格&"号" 3、如果是4位金额数的话,那么小数金额需要在万位加“¥”,可以利用If函数实现,函数如下: 万位小数=If(千位小数="¥","","¥")
至此,基本完美解决套打的问题。 未来将增加连续打印功能,敬请期待!
|