如何使用多个命令按钮(OLEObject)创建新工作表?

时间:2018-04-26 20:23:01

标签: excel vba excel-vba createoleobject

我正在处理一个有两个命令按钮的代码:

1)USER INPUT

2)执行

单击时,USER INPUT按钮会显示UserForm。根据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中。新工作表称为“Sec_Delay”,它只有一个命令按钮。我从stackoverflow上的其他地方解除了第一个命令按钮的代码,所以我不熟悉上一部分的内容:

    With .Parent.VBProject.VBComponents(.CodeName).CodeModule
        .insertlines .CountOfLines + 1, Code
    End With

但我主要了解OLEObject的工作原理。我只是不知道如何为新表格制作第二个命令按钮。

如何创建第二个命令按钮?为什么“Forms.CommandButton.2”没有做任何事情? “.1”究竟是什么意思?是否可以在同一个子中有两个OLEObject?

1 个答案:

答案 0 :(得分:1)

你差不多......

" Forms.CommandButton.1"是控件的 classname :它确定创建的控件类型,并且您不应该更改值或者不会识别它。

代码的最后一部分将按钮的事件处理程序添加到工作表的代码模块中:创建工作表后,您可以在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

编辑:如果要从常规模块调用位于工作表模块中的代码,则需要在调用中包含模块名称。

Sub TestCall()
    Sheet1.Tester
End Sub

...并确保您使用的是工作表的代号,而不是标签名称:

enter image description here

相关问题