Vba 如何创建具有多个命令按钮(OLEObject)的新图纸?
我正在编写一个有两个命令按钮的代码: 1) 用户输入 2) 执行 单击时,“用户输入”按钮将显示一个UserForm。根据用户表单输入,工作表格式将进行调整,用户将在提示的位置向工作表输入数据。“执行”按钮执行计算并填写工作表的其余部分,然后将结果绘制成图形,或打开一个新工作表,其中包含相同的两个按钮 我可以创建新工作表,但该工作表仅包含一个命令按钮。我的代码如下:Vba 如何创建具有多个命令按钮(OLEObject)的新图纸?,vba,excel,createoleobject,Vba,Excel,Createoleobject,我正在编写一个有两个命令按钮的代码: 1) 用户输入 2) 执行 单击时,“用户输入”按钮将显示一个UserForm。根据用户表单输入,工作表格式将进行调整,用户将在提示的位置向工作表输入数据。“执行”按钮执行计算并填写工作表的其余部分,然后将结果绘制成图形,或打开一个新工作表,其中包含相同的两个按钮 我可以创建新工作表,但该工作表仅包含一个命令按钮。我的代码如下: Dim obj As Object Dim Code As String Dim obj2 As Object Dim code2
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.2", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
End With
此代码位于创建新图纸的我的sub中。新的工作表称为“秒延迟”,它只有一个命令按钮。我从stackoverflow上的其他地方提取了第一个命令按钮的代码,因此我不熟悉最后一部分的功能:
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
但我基本上了解OLEObject是如何工作的。我只是不知道如何为新工作表创建第二个命令按钮
如何创建第二个命令按钮?为什么“Forms.CommandButton.2”什么都不做?“.1”到底是什么意思?在同一个子系统中是否可能有两个对象 你就快到了
“Forms.CommandButton.1”是控件的类名:它确定创建的控件类型,您不应该更改该值,否则excel将无法识别它
代码的最后一部分将按钮的事件处理程序添加到工作表的代码模块:创建工作表后,可以在VB编辑器中查看代码
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
'edit: use "Forms.CommandButton.1" again
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
.insertlines .CountOfLines + 1, code2 '<< added
End With
End With
…并确保使用的是工作表的代码名,而不是选项卡名:
谢谢@Tim,这很有效!我试图将Execute2Test按钮设置为运行与第一个按钮相同的代码,该按钮称为ExecuteButton_Click()。但是,当我键入
“Call ExecuteButton\u Click”
时,我会得到一个错误,显示:未定义子或函数。但它在第1页上定义为公共子执行按钮(Click()
)。如何让它运行第1页上的代码?我认为将其称为公共子模块将使其可以在任何地方被引用。请尝试Sheet1.ExecuteButton\u单击(或Sheet1模块的任何代码名)。Sheet1
code模块表示一个工作表对象,因此您需要相应地确定调用的范围。当我尝试这样做时,它仍然显示“需要对象”。接下来我尝试的是将所有数学代码都放入它自己的子模块中,这样ExecuteButton\u Click
只有一行代码Call MathCode
。然后我试着调用Sheet1.MathCode
,MathCode
,和Sheet1.ExecuteButton\u在OLEObject
中单击,但都不起作用。它们都返回相同的错误。如果您得到“object required”,则可能您没有使用正确的工作表模块名称:确保它与VB编辑器中树中显示的内容匹配。有人告诉我,您不能引用其他工作表模块中的代码。这是真的吗?他建议我将所有代码放在一个常规模块中,然后调用工作表模块中的sub。这引发了我无法理解的不同错误。我不明白为什么我不能随便给我的潜艇打电话,因为它是公开的。
Sub TestCall()
Sheet1.Tester
End Sub