ActiveX 控件命令按钮代码名称的虚假更改
Spurious change in code name of ActiveX control command button
不是重复的,因为尽管按照 Excel renaming Activex Controls on other computers 和其他地方的回答中的建议删除了 *.exd 文件,但仍会发生此处描述的问题。
我们网络上的一台特定机器(我们称它为 "Computer 2")虚假地悄悄更改了放置在 Excel 工作簿中的 ActiveX 命令按钮的代号。无论按钮的 (Name) 属性 之前是什么,它 returns 都是默认的 CommandButton*
方案。 (CommandButton1
, CommandButton2
...等)
见证下面的屏幕截图。 btn2
在计算机 2 上打开时代号变为 CommandButton1
。
为什么?我该如何解决这个问题?
我什至可以在两台机器上同时从网络驱动器上的同一个 Book1.xlsm 文件打开完全相同的工作簿(其中一台显然是只读的)。同时看两个屏幕,按钮名称不同!计算机 2 更改了它。
这当然会破坏按钮的功能,因为它们不再触发预期的事件代码。在下面的示例中,btn2
用于从 sheet 模块调用 Private Sub btn2_Click()
并执行该 Sub 中的代码。但是在计算机 2 上,该按钮不再命名为 btn2
,因此它不会触发该事件;它什么都不做——或者更糟的是,如果之前碰巧有一个名为 CommandButton1 的按钮,它会触发那个不相关的事件。
在计算机 1 上打开的工作簿:
完全相同的工作簿,但这次在计算机 2 上:
现在,这以前发生在我身上。这些年来有一两次,在几台不同的机器上,我所有的命令按钮都被这样重命名了。但我从来没有能够重现这一点,我想,损坏的工作簿,没什么大不了的。
但这在计算机 2 上每次都会发生。
非 ActiveX,表单控件按钮,例如上例中的 "Form Button 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 产品,就会发生这种情况。解决此问题的程序是:
下载这些补丁:
- Office 2010 补丁:http://support.microsoft.com/kb/2553154/EN-US
- Office 2013 补丁:http://support.microsoft.com/kb/2726958/EN-US
关闭所有 Office 程序(包括 Lync,如果有的话)。
- 安装 Office 2010 补丁。
- 安装 Office 2013 补丁。
- 从您的配置文件和所有其他用户配置文件中删除 *.exd 文件。有关说明,请参阅 this Stack Overflow answer and this Microsoft solution。
- 重启你的机器。
由于 none 任何推荐的解决方案都对我有用,我假设有些人仍然有这个问题并且对帮助我的修复感兴趣:
缩短按钮名称!
听起来很蠢,但我发现按钮名称的长度是有限制的。
通过制作一个新的 sheet 来试试这个,其中包含一个 ActiveX 命令按钮。
然后加入这段代码,按F5重复执行:
Public Sub test()
For Each o In ActiveSheet.OLEObjects
Debug.Print Len(o.Name); Tab(5); o.Name
o.Name = o.Name & "X"
Next
End Sub
您会注意到代码在
之后停止执行
31 CommandButton1XXXXXXXXXXXXXXXXX
是的,我找到了这个修复程序,因为我非常渴望尝试 seadoggie 的解决方案,但失败了,因为您无法阅读按钮的标题来确定按钮应该使用哪个名称。 :)
不是重复的,因为尽管按照 Excel renaming Activex Controls on other computers 和其他地方的回答中的建议删除了 *.exd 文件,但仍会发生此处描述的问题。
我们网络上的一台特定机器(我们称它为 "Computer 2")虚假地悄悄更改了放置在 Excel 工作簿中的 ActiveX 命令按钮的代号。无论按钮的 (Name) 属性 之前是什么,它 returns 都是默认的 CommandButton*
方案。 (CommandButton1
, CommandButton2
...等)
见证下面的屏幕截图。 btn2
在计算机 2 上打开时代号变为 CommandButton1
。
为什么?我该如何解决这个问题?
我什至可以在两台机器上同时从网络驱动器上的同一个 Book1.xlsm 文件打开完全相同的工作簿(其中一台显然是只读的)。同时看两个屏幕,按钮名称不同!计算机 2 更改了它。
这当然会破坏按钮的功能,因为它们不再触发预期的事件代码。在下面的示例中,btn2
用于从 sheet 模块调用 Private Sub btn2_Click()
并执行该 Sub 中的代码。但是在计算机 2 上,该按钮不再命名为 btn2
,因此它不会触发该事件;它什么都不做——或者更糟的是,如果之前碰巧有一个名为 CommandButton1 的按钮,它会触发那个不相关的事件。
在计算机 1 上打开的工作簿:
完全相同的工作簿,但这次在计算机 2 上:
现在,这以前发生在我身上。这些年来有一两次,在几台不同的机器上,我所有的命令按钮都被这样重命名了。但我从来没有能够重现这一点,我想,损坏的工作簿,没什么大不了的。
但这在计算机 2 上每次都会发生。
非 ActiveX,表单控件按钮,例如上例中的 "Form Button 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 产品,就会发生这种情况。解决此问题的程序是:
下载这些补丁:
- Office 2010 补丁:http://support.microsoft.com/kb/2553154/EN-US
- Office 2013 补丁:http://support.microsoft.com/kb/2726958/EN-US
关闭所有 Office 程序(包括 Lync,如果有的话)。
- 安装 Office 2010 补丁。
- 安装 Office 2013 补丁。
- 从您的配置文件和所有其他用户配置文件中删除 *.exd 文件。有关说明,请参阅 this Stack Overflow answer and this Microsoft solution。
- 重启你的机器。
由于 none 任何推荐的解决方案都对我有用,我假设有些人仍然有这个问题并且对帮助我的修复感兴趣:
缩短按钮名称!
听起来很蠢,但我发现按钮名称的长度是有限制的。
通过制作一个新的 sheet 来试试这个,其中包含一个 ActiveX 命令按钮。 然后加入这段代码,按F5重复执行:
Public Sub test()
For Each o In ActiveSheet.OLEObjects
Debug.Print Len(o.Name); Tab(5); o.Name
o.Name = o.Name & "X"
Next
End Sub
您会注意到代码在
之后停止执行31 CommandButton1XXXXXXXXXXXXXXXXX
是的,我找到了这个修复程序,因为我非常渴望尝试 seadoggie 的解决方案,但失败了,因为您无法阅读按钮的标题来确定按钮应该使用哪个名称。 :)