Назначить код для кнопки, созданной динамически
Я пытаюсь получить кнопку, которую я динамически создал в форме Excel, для запуска макроса с именем 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"
2 ответа
Вот пример. Пожалуйста, измените его в соответствии с вашими потребностями:)
Этот пример создаст командную кнопку и назначит ей код, чтобы при нажатии на нее отображался "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
СНАПШОТ
Вам необходимо добавить код в пользовательскую форму программно. Я использовал мой код из этой статьи VBax в качестве ссылки
Код ниже:
- Запускается из обычного модуля
- Добавляет кнопку в пользовательскую форму с именем UserForm1
Добавляет этот код в пользовательскую форму для события клика
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