Excel VBA 编程 -- 对一种错误情况的处理
最近经常碰到打开文件时 Excel 报错的情况,如图所示:如果点击“否”,则 Excel 什么也不做。如果点击“是”,Excel 会把文件中所有的 VBA 代码都删除,只剩下工作表(或许还有其他的对象,譬如 Chart 图形),如图:就我所遇到的情况而言,似乎也说不出哪里出现了问题,Excel 的解决方式简单粗暴:直接删除所有 VBA 代码!如果你在一个 Excel 文件上工作了很久,积累了很多的 VBA 代码,突然发生这种情况,是非常恼人的。网上查了一下,发现近期的 Excel 经常发生这种事情,导致人们非常恼火,但似乎也没有什么“灵丹妙药”。在发生过多次“事故”之后,实在忍无可忍,只能着手解决这个问题。Excel 文件(.xlsx,.xlsm,.xlam 等)实际上就是一个压缩文件,将文件扩展名改为 .zip,用压缩软件打开,就可以看到文件的结构,如图:可以看到,xl 文件夹中有一个 vbaProject.bin 文件,所有的 VBA 代码都在这个文件中。把这个文件提取出来,就可以保存 VBA 代码以免被 Excel 删除。vbaProject.bin 是一个二进制文件,要是能够读取这个文件内容,就能够恢复我们费尽心血写成的 VBA 代码。网上查了一下,发现读取 vbaProject.bin 文件的工具还不少。有一个 oletools 的 Python 软件包(所以,要能够使用这个软件包,要确保你的机器上安装有 Python),里面有一个 olevba 可以读取 vbaProject.bin。oletools 安装完毕之后,就可以启动 olevba 读取 vbaProject.bin 了:由图可以看出,所有 VBA 代码都在 MyModule 模块中。将 olevba 的输出重定向到 MyModule.bas 文件,在生成的 MyModule.bas 文件中,删除不需要的内容,只留下 VBA MACRO MyModule.bas 下面的代码。下面回到前面的 .zip 文件。在解压软件中直接删除 vbaProject.bin,退出解压软件。此时的 .zip 文件已经不含有 vbaProject.bin 文件了。现在将 .zip 扩展名改回原来的 .xlsm。打开该文件,Excel 不再报错。打开 VBE,在“文件”菜单中选择“导入文件...”,导入我们上面恢复出来的 MyModule.bas。保存,退出。再次打开该 Excel 文件,一般来说将能够正常打开,如果还是有问题,则重复上面的步骤,但在导入 MyModule.bas 之前,确保要修复的 Excel 文件能够正常保存并打开。