【问题标题】:Spurious change in code name of ActiveX control command buttonActiveX 控件命令按钮代号的虚假更改
【发布时间】:2018-05-31 15:05:38
【问题描述】:

不是重复的,因为尽管已按照Excel renaming Activex Controls on other computers 和其他地方的答案中的建议删除了 *.exd 文件,但此处描述的问题仍然存在。


我们网络上的一台特定机器(我们称其为“计算机 2”)以虚假且无声的方式更改 Excel 工作簿中的 ActiveX 命令按钮的代号。无论按钮的 (Name) 属性以前是什么,它都会将其返回到默认的 CommandButton* 方案。 (CommandButton1CommandButton2...等)

请看下面的截图。 btn2 在计算机 2 上打开时,代码名称变为 CommandButton1

为什么?我该如何解决这个问题?

我什至可以在两台机器上同时从网络驱动器上的同一个 Book1.xlsm 文件打开完全相同的工作簿(其中一台显然是只读的)。同时看两个屏幕,按钮名称不一样!计算机 2 改变了它。

这当然会破坏按钮的功能,因为它们不再触发预期的事件代码。在下面的示例中,btn2 用于从 sheet 模块调用 Private Sub btn2_Click() 并执行该 Sub 中的代码。但是在计算机 2 上,该按钮不再命名为 btn2,因此它不会触发该事件;它什么都不做——或者更糟的是,如果之前碰巧有一个名为 CommandButton1 的按钮,它会触发那个不相关的事件。

在计算机 1 上打开的工作簿:

完全相同的工作簿,但这次是在计算机 2 上:

现在,我以前也遇到过这种情况。多年来,在几台不同的机器上,我所有的命令按钮都像这样重命名了一次或两次。但我从来没有能够重现这一点,我想,损坏的工作簿,没什么大不了的。

但这在计算机 2 上始终如一地发生,每一次。

非 ActiveX 表单控件按钮,例如上例中的“表单按钮 1”,不受此问题的影响。一个明显但乏味的解决方法是去掉我所有的 ActiveX 按钮(如this answer 中所建议的那样)并将它们转换为例如表单控制按钮,但目的是避免这种核选项。

【问题讨论】:

  • 你能发布用于创建按钮的代码吗?您可以尝试从计算机 2 中删除 msforms 吗?只是一些尝试,它不会伤害任何东西。 stackoverflow.com/questions/27411399/…
  • @99moorem:我知道:stackoverflow.com/a/27500258/119775 不幸的是,不是这样。没有使用代码来创建按钮;我只是从 Developer > Insert 手动添加它们。
  • @Jean-FrançoisCorbett Certain MS security updates may cause such harm.。你能检查机器的最新更新吗?它是否运行与其他机器相同的软件更新映像?规格一样吗?操作系统、MS Office 版本等?还要检查 Excel 是否正在创建新控件,而不是重命名您刚刚更改的内容。
  • Here's another post on the subject.。不过,我并不打算进行近距离投票。
  • @bonCodigo:这不是重复的,因为尽管应用了建议的修复程序in that answer 并且我已经知道了,但仍会出现问题。关闭的投票总是可以撤回...

标签: vba excel excel-2010 activex


【解决方案1】:

首先,我对 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

【讨论】:

    【解决方案2】:

    由于没有任何推荐的解决方案对我有用,我假设有些人仍然有这个问题并且对帮助我的修复感兴趣:

    让您的按钮名称更短!

    听起来很愚蠢,但我发现按钮名称的长度是有限制的。

    通过制作一个包含一个 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 命令按钮1XXXXXXXXXXXXXXXXXX

    是的,我找到了这个修复,因为我非常绝望地尝试了 seadoggie 的解决方案,但失败了,因为您无法读取按钮的标题来确定按钮应该使用哪个名称。 :)

    【讨论】:

      【解决方案3】:

      一位同事发现,如果计算机上同时安装了 Office 2010 和 Office 2013 产品,就会出现这种情况。解决这个问题的过程是:

      1. 下载这些补丁:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多