使用VBA重新创建具有VBA事件的ActiveX控件

时间:2016-10-25 20:53:59

标签: vba excel-vba activex excel

我有一个组合框,它有多个与之相关的事件(例如,ComboBox1_Change,Click,GotFocus,LostFocus)。出于我的目的,我需要使用ActiveX控件。

对于某些背景:

我遇到了一个问题,当机器连接到投影仪时,ActiveX控件会出现故障。其他人有同样的问题,但没有解决方案。我发现解决此问题的最佳方法是创建一个用户可以单击的其他按钮,删除ActiveX控件并重新创建它。

问题是(和我的问题)......当我这样做时,VBA事件不再执行。该控件的名称完全相同。是否有一个简单的修复(例如我可以设置的ActiveX控件中的属性),因此我不需要编写VBA代码来删除和重写现有的VBA代码(我甚至不能100%确定会解决问题) ?

1 个答案:

答案 0 :(得分:1)

这似乎对我有用,在工作表中:

从工作表上的2个CommandButtons开始:CommandButton1CommandButton2

您无法单步执行代码,但它会运行。

Option Explicit

Private Sub CommandButton1_Click()
  Dim oldObj As OLEObject
  Dim left As Double, top As Double, width As Double, height As Double
  Set oldObj = Me.OLEObjects("CommandButton2")

  With oldObj
    'Rename the control to detach events
    .Name = "CommandTEMP"
    left = .left
    top = .top
    width = .width
    height = .height
    .Delete
  End With

  Dim newObj As Object

  Set newObj = Me.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
        , DisplayAsIcon:=False, left:=left, top:=top, width:=width, height:=height)

  newObj.Name = "CommandButton2"

End Sub

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  Me.CommandButton2.Object.Caption = Timer
End Sub