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

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

这是我用来在电子表格上添加一个命令button的代码(对于另一个button,只是不同的variables,它本质上是一样的):

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 

我想知道是否有可能做同样的事情,但创build的button是窗体控件而不是ActiveX?

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

希望能得到一些帮助。

而不是使用ActiveXbutton,使用形状并设置Shape.OnAction属性来调用通常放在ActiveXbutton后面的macros。 在macros中,您可以使用Application.Caller来获取被点击的形状的名称,从而让您知道哪个button被点击并相应地分支您的代码。