Ton*_*ton 20 excel vba excel-vba
我正在尝试获取一个我在excel userform表单上动态创建的按钮来运行一个宏transfer,我在Module 1项目的"模块"部分编写了这个宏.
下面我已经粘贴了我迄今为止在userform中编写的代码,它实际上设法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"
Run Code Online (Sandbox Code Playgroud)
Sid*_*out 24
这是一个例子.请修改它以满足您的需求:)
此示例将创建一个命令按钮并为其分配代码,以便在按下它时,它将显示"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
Run Code Online (Sandbox Code Playgroud)
并将此代码粘贴到类模块中
Option Explicit
Public WithEvents CmdEvents As MSForms.CommandButton
Private Sub CmdEvents_Click()
MsgBox "Hello Word"
End Sub
Run Code Online (Sandbox Code Playgroud)
快照

您需要以编程方式将代码添加到UserForm.我使用了这篇vbax文章中的代码作为参考
代码如下:
将此代码添加到Clickform以获取Click事件
Private Sub CommandButton1_Click()
Call Transfer
End Sub
Run Code Online (Sandbox Code Playgroud)来自普通模块的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
Run Code Online (Sandbox Code Playgroud)