有没有办法以编程方式添加表单控件?

时间:2016-09-01 11:05:18

标签: excel vba excel-vba activex controls

我正在使用带有表单控件的电子表格,该表单控件打开用于数据输入目的的用户表单。表单的提交按钮填充一行单元格,并在该行的最后两个单元格上添加两个按钮。它将插入与用户一样多的行,并且每次使用自己的不同名称创建两个新按钮。但是,这些是ActiveX控件,一旦同事打开文件并尝试在其笔记本电脑上使用它们,它们就会给我与其他Windows / Office版本的兼容性问题。

这是我用来在电子表格上添加一个命令按钮的代码(对于其他按钮,它实际上是相同的,只是不同的变量):

Dim i As Long, Hght As Long
Dim Name As String, NName As String


i = 0
Hght = 305.25

NName = "cmdAction" & i

For Each OLEObject In ActiveSheet.OLEObjects
    If Left(OLEObject.Name, 9) = "cmdAction" Then
        Name = Right(OLEObject.Name, Len(OLEObject.Name) - 9)
        If Name >= i Then
            i = Name + 1
        End If
        NName = "cmdAction" & i
        Hght = Hght + 27
    End If
Next
  Dim UpdateEntry As OLEObject, N%

Set UpdateEntry = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
    , DisplayAsIcon:=False, Left:=Selection.Offset(0, 23).Left, Top:=Selection.Offset(0, 23).Top, Width:=72, Height _
    :=24)


UpdateEntry.Name = NName     
UpdateEntry.Object.Caption = "Edit Entry"
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
    N = .CountOfLines
.InsertLines N + 1, "Private Sub " & NName & "_Click()"
.InsertLines N + 2, vbTab & "Code for button goes here"
.InsertLines N + 3, vbTab & "End Sub"
End With

我想知道是否可以做同样的事情,但创建的按钮是表单控件而不是ActiveX?

显示的错误是运行时错误32809:应用程序定义的错误或对象定义的错误。经过广泛的研究,我发现它发生的原因是一旦不同版本的Windows改变它,表单就会被破坏。修复它的唯一方法是创建一个新工作表,将所有内容复制到新工作表,删除损坏的工作表,并将新工作表重命名为以前的名称。这是有效的,但是不可能复制ActiveX控件,因为它们将被重命名并且相应的代码不在其中,但是用于打开UserForm的电子表格上的Form Control将工作得很好,这就是为什么我认为我唯一的解决方案是将所有ActiveX更改为Form Control。

会感激一些帮助。

1 个答案:

答案 0 :(得分:0)

使用Shapes而不是使用ActiveX按钮,并设置Shape.OnAction属性以调用通常放在ActiveX按钮后面的宏。在宏中,您可以使用Application.Caller获取被单击的形状的名称,从而允许您知道单击了哪个按钮并相应地分支您的代码。