2017-04-10 799 views
0

我需要创建将在运行时创建的代码CommandButton。这个命令按钮是动态的,因为它基于用户数据。在运行时创建的命令按钮代码不起作用[Excel VBA]

User_From代码

Private Sub UserForm_Activate() 

Dim ctlTXT As Control 

For RevNo = 1 To RevCounter 

    Set ctlTXT = Me.Controls.Add("Forms.CommandButton.1") 

    ctlTXT.name = RevNo 
    ctlTXT.Caption = Sheet4.Range("D" & RevNo + 4).value 
    ctlTXT.Left = 18 
    ctlTXT.Height = 18: ctlTXT.Width = 72 
    ctlTXT.Top = 15 + ((RevNo - 1) * 25)  
Next 

Me.Height = (RevNo * 17) + 50 

ReDim Preserve cmdArray(1 To RevNo) 
Set cmdArray(RevNo).CmdEvents = ctlTXT 
Set ctlTXT = Nothing 

End Sub 

类模块代码

Private Sub CmdEvents_Click() 

Dim i As Integer 

i = CmdEvents.name 

RevisionFormPrevious.LblResponsible.Caption = Sheet4.Range("C" & i +4).value 
RevisionFormPrevious.LblEdition.Caption = Sheet4.Range("D" & i + 4).value 
RevisionFormPrevious.LblTelNo.Caption = Sheet4.Range("E" & i + 4).value 
RevisionFormPrevious.LblFeatures.Caption = Sheet4.Range("D" & i + 4).value 
RevisionFormPrevious.Features.value = Sheet4.Range("F" & i + 4).value 

Load RevisionFormPrevious 
RevisionFormPrevious.Show 

End Sub 

的问题是,如果有创建了多个按钮,该代码只能用于创建最后一个按钮当第一个和第二个按钮被点击时,什么都没有发生。

+0

RevCounter在哪里声明,填充和调用时它的值是什么? –

+0

你的班级的名字是什么?在你的'Class'代码中,你需要在顶部添加'Public WithEvents CmdEvents As MSForms.CommandButton',然后,在你的'Sub'中,你需要使用'Dim ctlTXT As MSForms.CommandButton'来定义它。 –

+0

@MarkFitzgerald RevCounter is在另一个模块中声明为公共。调用时的值是可用的修订版本总数 –

回答

2

每个CommandButton都需要包含其名称的自己的事件过程。为了创建此过程,您需要访问VBA-Project,因为任何黑客都可能通过该门控制您的计算机,因此非常不鼓励VBA-Project。因此你有两种方法来处理这个问题。

  1. 创建尽可能多的CommandButtons,你可能需要,每一个都有自己的事件过程。隐藏您不需要立即需要的按钮并取消隐藏,并将其重新放置在您的代码现在创建它们的位置。
  2. 仅使用一个事件过程创建一个按钮,但为其Caption或可能的Tag属性分配不同的值。然后编程您的事件过程,根据点击按钮时标题或标记的内容做不同的事情。
+0

谢谢你的解决方案。遵循第一个选项会很复杂,因为我不知道应该创建多少个,因为这取决于用户。它的工作现在。 –