【问题标题】:Use VBA to create a dynamic form with a button using "vbModeless"使用 VBA 使用“vbModeless”创建带有按钮的动态表单
【发布时间】:2021-02-14 07:25:42
【问题描述】:

我想在运行时创建一个 vbModeless 动态用户表单。用户表单只有一个按钮,就是这样。该表单使用vbModal 可以正常工作,但不幸的是vbModeless 我无法让按钮工作的点击事件。单击按钮不会调用事件。我正在使用以下步骤/代码:

  • 创建了一个名为UserForm1的空用户表单

  • 使用以下代码创建了一个名为 Modul1 的模块:

    Sub CreateFormControls()
    
      'Create Command Button
      Dim Button01 As MSForms.CommandButton
      Set Button01 = UserForm1.Controls.Add("Forms.CommandButton.1", "dynButton01", False)
      Button01.Visible = True
    
      'Reference click event
      Dim ClickEvents As New Class1
      Set ClickEvents.ButtonEvent = Button01
    
      'Show User Form
      UserForm1.Show vbModeless '-> THIS DOES NOT WORK, only vbmodal works
    
    End Sub
    
  • 使用以下代码创建了一个名为 Class1 的类模块:

     Public WithEvents ButtonEvent As MSForms.CommandButton
    
     Private Sub ButtonEvent_Click()
         MsgBox "Test"
         Unload UserForm1
     End Sub
    

有没有办法让这个工作与vbModeless 一起工作,还是有不同的工作?

注意:我还没有大量使用动态表单,我使用 existing code snippet 复制/修改了显示的实现,但没有完全理解按钮对象如何引用点击事件,例如为什么需要一个单独的类,而我不能在 Modul1 的过程中做到这一点。我认为这就是为什么它无法打开非模态表单的原因。对这个问题稍加了解也将不胜感激。

【问题讨论】:

  • ClickEvents 应该在模块级别声明,即在任何其他过程之前的模块顶部。
  • 顺便说一句,您好像有错字。看起来应该是Set ClickEvents.ButtonEvent = Button01
  • 我建议您经常将Option Explicit 放在任何模块的最顶部,以帮助捕获错误,例如上面的那个。
  • @Domenic 是的,您的错字是正确的,谢谢。我在我的代码中更改了它,但我忘记在问题中更改它(所以这不是实际代码中的问题)。我也使用 Option Explicit,它与这个问题无关,所以我把它省略了。事件的减速 在类模块中它在最上面,在任何程序之前(实际上我测试中的类和模块只包含本例所示的代码)

标签: vba events runtime userform


【解决方案1】:

ClickEvents 应该在模块级别声明...

Option Explicit

Dim ClickEvents As New Class1 'declared at the module level

Sub CreateFormControls()

  'etc
  '
  '

End Sub

【讨论】:

  • 啊,我明白了,你的意思是班级减速。这是为什么?当模块中的子模块完成减速时,类实例是否被销毁(如问题所示)?如果在模块中声明,类实例的生存期是多久?
  • 是的,没错。在过程中声明的变量在过程结束时被销毁,而在模块级别声明的变量在程序结束时被销毁。前者称为局部变量,后者称为全局变量。
  • 我知道,但是“程序结束”在这种情况下到底是什么意思(严格来说,“程序”只是一个子,所以它应该在子结束后结束,这显然不是' t 案例)?
  • 在这种情况下,“程序”是与您在其中运行的任何对象相关联的 VBProject(工作簿?文档?)。例如。见stackoverflow.com/questions/7041138/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2012-02-14
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多