Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何创建具有多个命令按钮(OLEObject)的新图纸?_Vba_Excel_Createoleobject - Fatal编程技术网

Vba 如何创建具有多个命令按钮(OLEObject)的新图纸?

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

我正在编写一个有两个命令按钮的代码:

1) 用户输入

2) 执行

单击时,“用户输入”按钮将显示一个UserForm。根据用户表单输入,工作表格式将进行调整,用户将在提示的位置向工作表输入数据。“执行”按钮执行计算并填写工作表的其余部分,然后将结果绘制成图形,或打开一个新工作表,其中包含相同的两个按钮

我可以创建新工作表,但该工作表仅包含一个命令按钮。我的代码如下:

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