Назначить код кнопке, созданной динамически

Я пытаюсь получить кнопку, которую я создал динамически в форме excel userform, чтобы запустить макрос с именем transfer, который я написал в разделе Module 1 раздела "Модули" моего проекта.

Ниже я вставил код, который я написал до сих пор в пользовательской форме, которая фактически управляет созданием кнопки Transfer to Sheet в фрейме (который я также создавал динамически), но по какой-то причине, когда я запускаю VBA Я получаю сообщение 438 error, говорящее, что Object doesn't support this property or method.

Может ли кто-нибудь сказать мне, как я могу это разрешить?

Здесь код:

Dim framecontrol1 As Control

Set workitemframe = Controls.Add("Forms.Frame.1")
With workitemframe
    .Width = 400
    .Height = 400
    .Top = 160
    .Left = 2
    .ZOrder (1)
    .Visible = True
End With

workitemframe.Caption = "Test"
Set framecontrol1 = workitemframe.Controls.Add("Forms.commandbutton.1")

With framecontrol1
    .Width = 100
    .Top = 70
    .Left = 10
    .ZOrder (1)
    .Visible = True
    .Caption = "Transfer to Sheet"
End With
framecontrol1.OnAction = "transfer"

Ответ 1

Вот пример. Пожалуйста, внесите изменения в соответствии с вашими потребностями:)

В этом примере создается командная кнопка и назначается код, чтобы при нажатии она отобразила "Hello World".

Вставьте этот код в событие щелчка кнопки управления, которая будет динамически создавать новую командную кнопку и присваивать ей код.

Option Explicit

Dim cmdArray() As New Class1

Private Sub CommandButton1_Click()
    Dim ctl_Command As Control
    Dim i As Long

    i = 1

    Set ctl_Command = Me.Controls.Add("Forms.CommandButton.1", "CmdXYZ" & i, False)

    With ctl_Command
        .Left = 100
        .Top = 100
        .Width = 255
        .Caption = "Click Me " & CStr(i)
        .Visible = True
    End With

    ReDim Preserve cmdArray(1 To i)
    Set cmdArray(i).CmdEvents = ctl_Command

    Set ctl_Command = Nothing

End Sub

и вставьте этот код в модуль класса

Option Explicit

Public WithEvents CmdEvents As MSForms.CommandButton

Private Sub CmdEvents_Click()

    MsgBox "Hello Word"

End Sub

СНАПШОТ

enter image description hereenter image description here

Ответ 2

Вам необходимо добавить код в UserForm программно. Я использовал свой код из статьи vbax в качестве ссылки

Код ниже:

  • Выполняется из обычного модуля
  • Добавляет кнопку в UserForm под названием UserForm1
  • Добавляет этот код в пользовательскую форму для события Click

    Private Sub CommandButton1_Click()
    Call Transfer
    End Sub
    

VBA из нормального модуля

    Sub AddToForm()
    Dim UF As Object
    Dim frameCOntrol1 As Object
    Set UF = ActiveWorkbook.VBProject.VBComponents("UserForm1")
    Set frameCOntrol1 = UF.designer.Controls.Add("Forms.CommandButton.1")
    With frameCOntrol1
        .Width = 100
        .Top = 70
        .Left = 10
        .ZOrder (1)
        .Visible = True
        .Caption = "Transfer to Sheet"
    End With

    With UF.CodeModule
        .InsertLines 2, _
                     "Private Sub " & frameCOntrol1.Name & "_Click()" & Chr(13) & _
                     "Call Transfer" & Chr(13) & _
                     "End Sub"
    End With

End Sub