前文以报税记账系统为例,详细介绍基于Excel + vba+mysql的系统搭建和开发方法以及权限控制的实现逻辑、新增模块的集成和实现方法以及将加载宏打包成exe安装包的方法,本文介绍是VBA程序“脱离”Excel运行的核心逻辑和方法
注意:“脱离”加引号其实已经给出了答案,准确的说是可以在形式上脱离,但不能做到真正脱离。
一、背景
很多人问过这样一个问题:Excel VBA开发的东西总觉得有点low,但自己不是科班开发人员,不会用其它开发语言,所以就想还继续使用VBA,但是希望开发出来展示于人的是独立的应用程序,即不依赖于Excel,就自欺欺人地觉得自己开发 的东西高大上了起来
。博主按:
其实,真正懂得VBA价值的开发者是不会徒劳地去做这些毫无意义的事情的,因为任何系统都有其局限性,正如网站必须用浏览器访问,关系型数据库支持不了非关系型数据一样,VBA的价值正是通过诸如Excel这样的宿主来体现出来的,那有何必掩耳盗铃呢!
不过,在形式上“脱离”是完全可以做到的,本文手把手来教你。
但宿主的隐藏需要一些技巧,因为Excel作为办公人员的高频应用,需要明确什么时候该隐藏什么时候该显示,且互不干扰。这里就用到了一个Excel.application的概念,即Excel实例。众所周知,当新建一个Excel文档时,文档名一般默认为工作薄1,再创建一个就是工作薄2、工作簿3,这在形式上是三个文档,实际上却是用同一个实例创建的,这通过任务管理器中的进程可以很明确地看出来如下图:其实VBA工程的宿主是Excel实例,而不是Excel文档,虽然大多数时候好像每编写一个VBA小工具都会伴随着Excel文档,这恰恰误导了开发者。比较典型的例子是加载宏,可以在完全不用创建工作簿的情况下开发加载宏,这是vba的宿主为Excel实例的最好证明。那么问题就来了,如果把VBA程序的宿主给隐藏,那么该实例下工作簿是否也不可见了呢?答案是肯定的。所以,核心工作是将日常工作用的Excel实例与VBA工程需要隐藏的实例隔离,做到互不干扰。当打开一个excel文档的时候,默认会通过已经运行的实例去打开,如果没有则会创建一个新实例,也就是说,无论是先打开的VBA工程,还是先打开的工作文档,双方都会位于同一实例下,这与实例隔离的目标相悖,这需要一个可运行宏的xlsm(假如命名为main.xlsm)文件做中转。解决方案是通过已有实例打开main.xlsm,通过中转文件创建一个新的隐藏实例,通过该实例打开VBA主程序,同时关闭main.xlsm,这样就变相地将已经运行的实例和需要隐藏的宿主实例进行了隔离。综上:已经运行的实例➡️打开main.xlsm➡️创建新实例➡️打开VBA主程序submain.xls,➡️关闭main.xlsm通过上述过程,已经运行的实例1️⃣和VBA主程序的宿主实例2️⃣将各自互相独立的完成各自的工作。如下图,留个作业:可以看到,例子中的程序虽然独立运行了,但是任务栏的图标还是和Excel共用,思考一下,能否自定义一下独立运行程序的图标?还是那句老话:无论设计得多完美的系统、思考得多周到的设计,都会有不足之处。当你通过这样一个简易的系统把前中后端打通,那么你就是一个真正的系统开发者而不是表格制作者了。