ActiveX控件命令按钮

时间:2015-07-03 08:22:17

标签: excel vba excel-vba excel-2010 activex

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

我们网络上的一台特定计算机(让我们称之为#34;计算机2")虚假地,无声地更改放置在Excel工作簿中的ActiveX命令按钮的代码名称。无论之前按钮的(Name)属性是什么,它都会将其返回到默认的CommandButton*方案。 (CommandButton1CommandButton2 ......等等)

见下面的截图。在计算机2上打开时,btn2的代码名称将更改为CommandButton1

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

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

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

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

enter image description here

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

enter image description here

现在,这发生在我之前。多年来,在几台不同的机器上,我的所有命令按钮都被重命名了一两次。但我从来没有能够重现这一点,我想,工作簿已损坏,没什么大不了的。

但这种情况在计算机2上始终如一。

非ActiveX,表单控制按钮,例如"表单按钮1和#34;在上面的示例中,不受此问题的影响。一个明显但乏味的修复方法是摆脱我的所有ActiveX按钮(如this answer中所建议的那样)并将其转换为例如表格控制按钮,但目的是避免这种核选项。

3 个答案:

答案 0 :(得分:0)

首先,我对VBA的了解非常有限。

第二:我不知道为什么会这样,但我知道如何修复它...在workbook_open中你可以运行代码将任何CommandButtons重命名为你想要的名字吗?这肯定是令人讨厌的,但它至少是一个临时修复,直到有人能够找到地球上发生这种情况的原因! :)

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

答案 1 :(得分:0)

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

  1. 下载这些补丁:

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

  3. 安装Office 2010修补程序。
  4. 安装Office 2013修补程序。
  5. 从您的个人资料和所有其他用户个人资料中删除* .exd文件。有关说明,请参阅this Stack Overflow answerthis Microsoft solution
  6. 重新启动计算机。

答案 2 :(得分:0)

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

缩短您的按钮名称!

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

通过制作一个包含一个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的解决方案,因为你无法读取按钮的标题以确定按钮应该得到的名称。 :)