Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行时创建的命令按钮代码无效[Excel VBA]_Vba_Excel_Class_Userform - Fatal编程技术网

运行时创建的命令按钮代码无效[Excel VBA]

运行时创建的命令按钮代码无效[Excel VBA],vba,excel,class,userform,Vba,Excel,Class,Userform,我需要为将在运行时创建的CommandButton创建代码。此命令按钮是动态的,因为它基于用户数据 来自代码的用户\u 类模块代码 问题是,如果创建了多个按钮,则代码仅适用于最后创建的按钮。单击第一个和第二个按钮时,什么也没有发生。每个CommandButton都需要包含其名称的自己的事件过程。为了创建此过程,您需要访问VBA项目,这是非常不鼓励的,因为任何黑客都可以通过该门控制您的计算机。因此,你有两种方法来处理这个问题 创建尽可能多的命令按钮,每个按钮都有自己的事件过程。隐藏不需要的按钮,取

我需要为将在运行时创建的
CommandButton
创建代码。此命令按钮是动态的,因为它基于用户数据

来自代码的用户\u

类模块代码


问题是,如果创建了多个按钮,则代码仅适用于最后创建的按钮。单击第一个和第二个按钮时,什么也没有发生。

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

  • 创建尽可能多的命令按钮,每个按钮都有自己的事件过程。隐藏不需要的按钮,取消隐藏并重新定位到代码现在创建它们的位置
  • 仅使用一个事件过程创建一个按钮,但为其标题或标记属性指定不同的值。然后,根据单击按钮时的标题或标记,对事件过程进行编程,以执行不同的操作

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

  • 创建尽可能多的命令按钮,每个按钮都有自己的事件过程。隐藏不需要的按钮,取消隐藏并重新定位到代码现在创建它们的位置
  • 仅使用一个事件过程创建一个按钮,但为其标题或标记属性指定不同的值。然后,根据单击按钮时的标题或标记,对事件过程进行编程,以执行不同的操作

  • RevCounter
    在哪里声明、填充,调用时它的值是多少?类的名称是什么?在
    类中
    代码中,您需要在顶部添加
    Public with events CmdEvents As MSForms.CommandButton
    ,然后在
    中,您需要使用
    Dim ctlttxt As MSForms来定义它。CommandButton
    @MarkFitzgerald RevCounter在另一个模块中声明为Public。调用时的值是修订的总数available@ShaiRado艾尔·雷迪宣布。对不起,我没有把它包括在问题中。已经更改了ctlTXT,但没有任何效果。您应该将对象添加到循环内的数组中,而不是在它之后。在哪里声明、填充了
    RevCounter
    ,调用时它的值是多少?类的名称是什么?在
    类中
    代码中,您需要在顶部添加
    Public with events CmdEvents As MSForms.CommandButton
    ,然后在
    中,您需要使用
    Dim ctlttxt As MSForms来定义它。CommandButton
    @MarkFitzgerald RevCounter在另一个模块中声明为Public。调用时的值是修订的总数available@ShaiRado艾尔·雷迪宣布。对不起,我没有把它包括在问题中。已经更改了ctlTXT,但没有任何效果。您应该将对象添加到循环中的数组中,而不是之后。感谢您提供的解决方案。遵循第一个选项会很复杂,因为我不知道应该创建多少,因为这取决于用户。现在开始工作了。谢谢你的解决方案。遵循第一个选项会很复杂,因为我不知道应该创建多少,因为这取决于用户。现在开始工作了。
    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