Как я могу создать новый лист с несколькими командными кнопками (OLEObject)? - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над кодом с двумя командными кнопками:

1) ПОЛЬЗОВАТЕЛЬСКИЙ ВХОД

2) Выполнить

При щелчке по кнопке USER INPUT появляется пользовательская форма. Основываясь на вводе пользовательской формы, формат рабочего листа корректируется, и пользователь вводит данные в рабочий лист, где запрашивается. Кнопка «Выполнить» выполняет вычисления и заполняет оставшуюся часть листа, а затем составляет график результатов ИЛИ открывает новый лист, который затем содержит те же две кнопки.

Я могу создать новый лист, но лист содержит только одну командную кнопку. Мой код ниже:

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

Этот код находится в моей подпрограмме, которая создает новый лист. Новый лист называется «Sec_Delay» и имеет только одну командную кнопку. Я поднял код для первой кнопки команды где-то еще в stackoverflow, поэтому я не знаком с тем, что делает последняя часть:

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

Но я в основном понимаю, как работает OLEObject. Я просто не понимаю, как сделать вторую командную кнопку для нового листа.

Как я могу создать вторую командную кнопку? Почему «Forms.CommandButton.2» ничего не делает? Что означает «.1»? Можно ли иметь два объекта OLEO в одной и той же подпункте?

1 Ответ

0 голосов
/ 26 апреля 2018

Ты почти там ...

«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

РЕДАКТИРОВАТЬ: если вы хотите вызвать код, который находится в модуле листа из обычного модуля, вам необходимо включить имя модуля в вызов.

Sub TestCall()
    Sheet1.Tester
End Sub

... и убедитесь, что вы используете кодовое имя листа, а не имя вкладки:

enter image description here

...