前言
VBA是微软office系列软件内置的,自带输入输出的界面(想像一下Excel表), 所以用于解决日常工作中的问题就非常顺手。而且VBA语法简单,容易上手。只要有一点点基本编程知识就够了,可以边学边用。本文从一个具体的案列开始,讲解VBA的功能。因为相对复杂,所以拆解成若干篇。
本系列的目标读者是工作中的Power User, 他(她) 只需要具有少量编程概念,甚至没有也行。
背景介绍
在2018年之前,海关进口报关后取得的关税发票都是纸质的。因为公司进口业务量较大,所以有专门的团队处理进口关税发票。基本流程是先收集并核对纸质发票,在Excel文件里录入发票号及金额等信息,然后分类(有几个不同的公司抬头,而且要区分几种不同的进口类别),然后统计汇总金额后做成交接单交财务入账。财务做好账后需要将发票交给税务处理增值税抵扣事宜。
2018年开始,对于进口关税,海关不再提供纸质发票。进出口团队需要到海关网站上去下载电子发票。
问题:
初期进出口团队仍沿用过去的流程,将下载的电子发票(pdf文件)打印出来,整理汇总。但是很快就遇到了一些实际问题:
- 发票经常被重复打印并统计。
因为从海关网站下载发票时,为确保不遗漏,都会将起始时间放宽一些,这样发票自然会有一部分的重复。另外在打印发票的过程中,因为数量较多,难免会失误重打。 - 打印发票工作量巨大,人手不足。
所以进出口团队提出,希望能够做个小工具,自动打印发票并确保不重复打印。
需求分析:
收到需求后,召集相关部门(进出口团队、记账团队、税务团队) 讨论后,确认了以下事实:
- 其实记账团队并不需要发票本身。记账团队更看重交接单,因为记账团队所需要的信息都已经在交接单上(发票数量、分类及金额)。对于原来的正式纸质发票,记账团队需要装订成册保管,但是对于电子发票,已经没有这个需求了。
- 税务团队也不需要发票本身,因为在金税系统官网上,只需要输出发票号就可以认证了。之前只所以需要发票,是因为进出口团队提供的发票清单中缺少几位字符,需要翻查纸质发票取得完整号码。而且此项工作也非常耗费精力。
鉴于这些发现,与进出口团队协商后,修改项目的目标为:实现海关进口关税电子发票的无纸化管理。初步设想方案为:
- 从进出口团队下载的电子发票文件中,提取相关信息,存入后台数据库。
- 根据提取的发票信息,自动分类统计,生成与财务的交接单。
- 进出口团队打印交接单,签字后与财务交接。
- 财务收到交接单后,确认入账。
- 税务在收到入账确认信息后,根据入账的月份,在税务网站认证发票。
在后续进一步了解操作细节中得知两个有趣的事情:
- 实际上从海关网站下载的电子发票,除了有pdf文件外,还有一个xml文件。查询海关文档后得知,这个文件是xbrl标准,实际上包含了电子发票的所有信息。所以并不需要从pdf文件中提取信息,从xml文件中提取就够了。难度登时降低很多。
- 金税网站上,有一个导入功能,可以批量导入发票。只是导入的文件有两个,其中一个文件内容是校验码。只要搞明白检验码的生成规律,那么就可以直接生成上传文件,而不再需要税务手工输入。
到此,需求已经非常明确,可以着手开发。
解决方案:
考虑到公司当时计划切换ERP系统,所以决定用VBA做成一个临时性工具。前台用Excel,后台用Access数据库(放在一个有访问权限控制的共享盘目录下)。大体上框架如下:
- 进出口团队工具
- 信息提取(批量文件解压、解析、去除重复)
- 信息修正及确认
- 信息上传(含电子发票pdf文件归档)
- 生成交接单
- 经手发票查询
- 进口固定资产类发票甄别(后来追加的功能)
- 记账团队工具
- 待入账发票查询
- 入账确认
- 已入账发票查询
- 发票归档核查
- 税务团队工具
- 待认证发票查询
- 生成用于发票认证的xml文件
- 已生成认证文件的发票查询
- 管理员工具
- 用户权限管理
- 工具版本管理
- 公司代码管理
- 异常业务数据修正
因为这4部分相对独立,为了方便开发及用户使用,各自成为独立的工具。
涉及的技术问题
工具开发涉及以下技术,会各自独立成篇:
- 用VBA操纵目录、文件文章链接
- 用VBA查询压缩软件安装位置 文章链接
- 用VBA实现批量解压缩 文章链接
- 用VBA解析xml文件(字符串提取)
- 用VBA对Excel表格进行排序、筛选
- 用VBA操纵后台数据库 文章链接
- 用VBA+Excel实现用户权限及工具版本管理
- 待续
结语
对于日常工作中的小项目,技术其实并不是最主要的问题,问题剖析反而更关键。做为用户,很多情况下只在意自己经手的那一小部分,缺乏全局观。如果不从更高的角度看待问题,往往会做无用功。以这个项目为例,如果依照用户的原始需求去开发一个工具,可以预见其生命必然短暂,用户很快就会提出新的问题,陷入恶性循环。
做为Power User, 需要即从流程的角度看问题,也从技术的角度看问题,将二者结合起来。这样比纯IT开发的工具更易使用,更有生命力。