在ActiveX控件命令按钮的代码名称中发生了错误的更改。
在ActiveX控件命令按钮的代码名称中发生了错误的更改。
这不是一个重复的问题,因为尽管按照Excel在其他计算机上重命名ActiveX控件和其他地方的答案建议删除了*.exd文件,但这里描述的问题仍然存在。
我们网络中的一台机器(我们称之为“计算机2”)会在不知不觉中更改放置在Excel工作簿中的ActiveX命令按钮的代码名称。无论按钮的(名称)属性之前是什么,它都会将其返回到默认的CommandButton*
方案(CommandButton1
,CommandButton2
等)。
请看下面的截图。在计算机2上打开时,btn2
的代码名称会更改为CommandButton1
。
为什么会这样?我该如何修复这个问题?
我甚至可以同时在两台机器上从相同的Book1.xlsm文件打开完全相同的工作簿(其中一个只读)。同时查看两个屏幕,按钮名称是不同的!是计算机2更改了它。
当然,这会破坏按钮的功能,因为它们不再触发其预期的事件代码。在下面的示例中,btn2
之前调用工作表模块中的Private Sub btn2_Click()
并执行该子程序中的代码。但是在计算机2上,按钮不再命名为btn2
,因此它不会触发该事件;它什么也不做 - 或者更糟糕的是,如果之前存在一个名为CommandButton1的按钮,则会触发与之无关的事件。
在计算机1上打开的工作簿:
完全相同的工作簿,但这次在计算机2上:
现在,这在我之前就发生过。多年来,有一两次在几台不同的机器上,所有的命令按钮都被重命名为这样。但我从未能够复现这个问题,我认为是工作簿损坏,没什么大不了的。
但是在计算机2上,每次都会一致地发生这种情况。
非ActiveX的窗体控件按钮,例如上面示例中的“窗体按钮1”,不受此问题的影响。一个明显但繁琐的解决方法是摆脱所有的ActiveX按钮(如这个答案中建议的),并将它们转换为例如窗体控件按钮,但目标是避免这种彻底的解决方法。
虽然我对VBA的了解很有限,但我对为什么会发生这种情况没有头绪,但我有一个修复它的想法...在`workbook_open`中,您可以运行代码将任何命令按钮重命名为所需的名称。这可能会很烦人,但至少在找出为什么会发生这种情况之前,这是一个临时的解决方法!
Sub Not_Workbook_Open() Dim btn As OLEObject, increment As Integer increment = 1 For Each btn In Sheets("Sheet1").OLEObjects btn.Name = "btn" & increment increment = increment + 1 Next End Sub
问题的原因是在一台计算机上安装了混合了Office 2010和Office 2013产品。解决方法如下:
1. 下载以下补丁:
- Office 2010补丁:[http://support.microsoft.com/kb/2553154/EN-US](http://support.microsoft.com/kb/2553154/EN-US)
- Office 2013补丁:[http://support.microsoft.com/kb/2726958/EN-US](http://support.microsoft.com/kb/2726958/EN-US)
2. 关闭所有Office程序(包括Lync)。
3. 安装Office 2010补丁。
4. 安装Office 2013补丁。
5. 从您的个人资料和其他用户资料中删除*.exd文件。有关说明,请参见[此Stack Overflow回答](https://stackoverflow.com/a/27500258/119775)和[此Microsoft解决方案](http://support.microsoft.com/kb/3025036/EN-US)。
6. 重新启动计算机。