ActiveX控件命令button代码名称的虚假更改
不重复,因为这里描述的问题发生,尽pipe已经删除了* .exd文件,如在其他计算机和其他地方的Excel重命名Activex控件的答案中所build议的那样。
我们networking上的一台特定的机器(我们称之为“计算机2”)虚假地并且默默地改变放置在Excel工作簿中的ActiveX命令button的代码名称。 无论button之前的(Name)属性如何,都会将其返回到默认的CommandButton*
scheme。 ( CommandButton1
, CommandButton2
等)
见证下面的截图。 在计算机2上打开时, btn2
的代码名称更改为CommandButton1
。
为什么? 我该如何解决?
我甚至可以在两台计算机上同时在networking驱动器上同一个Book1.xlsm文件打开完全相同的工作簿(显然,其中一个是只读的)。 同时查看两个屏幕,button名称是不同的! 电脑2改变了它。
当然,这会打破button的function,因为它们不再触发其预期的事件代码。 在下面的示例中, btn2
用于从表单模块调用Private Sub btn2_Click()
并执行该Sub中的代码。 但在计算机2上,该button不再被命名为btn2
,因此不会触发该事件; 它什么都不做 – 或者更糟的是,如果碰巧有一个叫做CommandButton1的button,它会触发这个不相关的事件。
计算机1上打开的工作簿:
完全相同的工作簿,但这次在计算机2上:
现在,这件事发生在我以前。 这些年来,一两次,在两台不同的机器上,我所有的命令button都被重命名。 但我从来没有能够重现这一点,我认为,损坏的工作簿,没有什么大不了的。
但是这一直发生在计算机2上,每一次。
非ActiveX,Form Controlbutton(如上例中的“Form Button 1”)不受此问题的影响。 一个明显而又乏味的解决方法是摆脱所有我的ActiveXbutton(如在这个答案中所build议的),并将它们转换成例如Form Controlbutton,但是其目的是避免这个核选项。
首先,我对VBA的知识非常有限。
第二:我不知道为什么发生这种情况,但我有一个想法如何解决它…在workbook_open你可以运行代码重命名任何CommandButtons到你想要的名字? 这当然会令人讨厌,但至less是一个临时的解决scheme,直到有人能够找出地球上的原因为止! 🙂
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
-
closures所有Office程序(包括Lync,如果有的话)。
- 安装Office 2010修补程序。
- 安装Office 2013修补程序。
- 从您的configuration文件和所有其他用户configuration文件中删除* .exd文件。 有关说明,请参阅此堆栈溢出答案和此Microsoft解决scheme 。
- 重新启动您的机器。
由于没有推荐的解决scheme为我工作,我假设有些人仍然有这个问题,并对帮助我的修复感兴趣:
缩短button名称!
听起来很愚蠢,但我发现button名称的长度是有限制的。
通过制作一个带有一个ActiveX CommandButton的新工作表来试试这个。 然后添加此代码并通过按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的解决scheme,失败,因为你不能读取button的标题,以确定button应该得到的名称。 🙂