遇到一个比较奇葩的问题,没找到解决方案,用英文关键词找了也没有,stackoverflow 和 EH 论坛都没有找到可以参考的方法,最后春节假期自己研究,搞定了。我和大约 300 个用户都是 win10 64+office365 或 office2016 环境。
我用 excel 做了设备维护用的巡检表,里面有一千多行 vba,实现了很多功能。里面有表单控件的命令按钮,也有 ActiveX 控件的命令按钮,维护人员填写完巡检表后点击按钮提交,会自动另存为 pdf 并把 xlsb 和 pdf 文件放到指定目录,然后调用 outlook 发邮件到指定邮箱归档文件。
前不久有同事给我发了七十多个文件,说里面有个按钮点击没反应,让我看下能不能修复。
我打开文件发现 ActiveX 按钮变成了图片,没有和代码关联。而大家知道,activeX 按钮在创建后双击直接就跳到自动创建的形如 private sub commandbutton1_Click () 私有过程中了,我就在这里面写的代码。
现在最简单的解决方法是,把 Private 去掉,在按钮上右键,重新绑定,选择 commandbutton1_Click,解决。但是我有很多文件,每个都有密码保护,都先解除密码再这么操作,太费劲了。有什么代码可以指定按钮关联哪个过程呢?找到了 OnAction 方法,用 ActiveSheet.Shapes (1).OnAction = "test" 这种可以。但是 Private sub 怎么办?经过测试,ActiveSheet.Shapes (1).OnAction = "Sheet1.CommandButton1_Click" 写成这样,可以了。
于是,我在 personal.xla 里写了如下代码,放到快速访问工具栏上,然后选中有问题的文件,每选 15 个,回车,全部打开(我 win11 下超过 15 个再按回车就没反应了,win10 下选 20 多个再按回车也可以)。点一下快速访问工具栏的图标(或者按快捷键,快速访问工具栏第一个图标快捷键就是 alt+1,第 8 个就是 alt+8),搞定,逐个点下去,一键修复,70 多个文件操作五六批全部搞定。
Sub 按钮绑定修复 ()
ActiveWorkbook.Sheets("test").Activate
解锁表
ActiveSheet.Shapes(1).OnAction = "sheet1.CommandButton1_Click"
ActiveWorkbook.Close 1
End Sub
主要就是要注意,私有过程,前面要加工作表名称。
这个问题我遇到过不止一次,好好的文件在有的用户电脑上保存一下就自动解绑了。我后面要远程看下那个用户 office 环境。
xlsb 文件损坏概率比 xlsm 大,但 xlsb 比 xlsm 感觉安全一点点,别人破解要先另存为 xlsm 或 xls 才行。
控件能用表单控件就尽量用表单控制,因为表单控件的兼容性比 ActiveX 控件要好的多。
我最早是 office2007 sp3 环境下开发的这一套模板,到 office2007 没有 sp 包的环境就不正常,至少要 sp2 才能正常,后面 office2010 也有问题,2013 也有问题,2016 问题最少,2007 以后,每个版本又有 32 和 64 位,头大的很。造成问题的主要就是 ActiveX 控件,每个版本要打哪个补丁,我曾经做过一个表,后面放弃了,太费劲了,统一要求 office2016,不是 2016 的卸载装 2016,问题少多了。