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 产品,就会发生这种情况。解决此问题的程序是:

  1. 下载这些补丁:

  2. 关闭所有 Office 程序(包括 Lync,如果有的话)。

  3. 安装 Office 2010 补丁。
  4. 安装 Office 2013 补丁。
  5. 从您的配置文件和所有其他用户配置文件中删除 *.exd 文件。有关说明,请参阅 this Stack Overflow answer and this Microsoft solution
  6. 重启你的机器。

由于 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 的解决方案,但失败了,因为您无法阅读按钮的标题来确定按钮应该使用哪个名称。 :)