■ldhyob 2003.11
把XLS文件封装成EXE文件,曾在论坛及其他地方见过,通过这种封装,能使开发出来的VBA程序显得非常专业,这是许多VBA爱好者追求的目标之一。但是,大多数生成的EXE文件仅仅是对某一XLS文档的封装演示,并不能保存用户对XLS数据的更改,也就是说当EXE把XLS文档打开后,当用户修改或编辑其中部分数据后关闭退出,然后再重新打开EXE,发现XLS数据并未发生任何改变.这是与我们封装代码的初衷是相违背的,我们必须要实现能接受XLS数据更改的EXE动态捆绑,只有这样,VBA FOR EXCEL的封装才会有意义.此例乃笔者将XLS捆绑成动态EXE的一个尝试.
曾在论坛上发过一张帖子:《我的EXCEL宏文档打开程序》,内容就是用VB6编制EXE主调程序,利用OLE方法对外部XLS进行打开操作.这个例子一定程度上对VBA进行了封装,如:加入了软件启动封面、跳过了宏提示等.但是这种封装的缺点是明显的,就是XLS文档作为外部文件单独存放,既增加了封装成品的文件个数,也使文档的VBA缺少代码保护,即便通过一些常规及非常规方法对文档进行口令保护或"工程不可查看",但因XLS文件在用户面前暴露无遗而极不保险.
基于以上,若将XLS隐匿于EXE中,并且能实现XLS数据的动态更新,将是一件快事!下面笔者将自己尝试的实现原理及思路简要说一下(仅仅是思路,具体做法不赘述),希望能给大家起到抛砖引玉的作用.
实现原理:利用VB的OLE调用与文件二进制读写(通道技术).
实现思路:总的目标就是将VB编译生成的EXE文件头与XLS数据部分捆绑结合,并在XLS关闭时能使EXE数据部分得以更新。
1、VB工程部分:用顶层窗体制作封面;对EXE(即自身)XLS数据进行读取并将其写入一定文件夹然后OLE打开它;借助时钟控件适时关闭封面窗体及退出EXE(此时XLS已经正常打开完毕了,完成VB与EXCEL的无缝连接)。
2、VBA部分:对EXCEL菜单与工具栏、图标进行自定义设置;在工作薄退出事件中增加代码,将XLS内容重新写入EXE中。
3、利用DOS的二进制COPY命令将VB的EXE部分与VBA的XLS部分结合成新的EXE文件。
这种动态EXE文件就制作完成了,它的优点是明显的:拥有自定义的图标作为EXE文件图标,拥有自定义的软件加载封面,拥有更改XLS数据的特性,而偏偏不“拥有”烦人的宏提示!!!缺点主要就是如果文档体积过于庞大,运行速度会有一定影响。
例子XLS部分还是沿用了《我的EXCEL宏文档打开程序》中文档,下载体验一下吧,若有BUG请告知,因为并未认真测试,谢谢!
2003年11月24日20:30分更新
注:如果在2003和XP版本下出现"不信任到Visual Basic Project的程序连接"的信息,主要是因为EXCEL的版本问题,.解决的办法是在菜单"工具"-"宏"-"安全性"的"可靠发行商"选项卡里将下面的"信任对于“Visual Basic 项目”的访问"前面的勾打上即可.
[此贴子已经被作者于2005-10-10 15:47:15编辑过] |