【问题标题】:Set values on User Form using form properties使用表单属性在用户表单上设置值
【发布时间】:2018-01-31 23:30:01
【问题描述】:

如果已经问过这个问题,我很抱歉,但我似乎找不到答案。我想在用户窗体上设置一个做某事,因为它是根据从属性传递给它的值加载的。我拥有的是 Excel 工作表上的一个按钮,它加载用户表单,如下所示:

 Sub button()
   Dim fm As New UserForm1
   fm.ValueToPass = "Hello"
   fm.Show
 End Sub

表单后面是以下代码:

Private myString As String

Public Property Let ValueToPass(ByVal x As String)
   myString = x
End Property

Private Sub UserForm_Initialize()
   If myString = "Hello" Then
      'Do something on my form
   else
      'Do something else on my form
   end if
End Sub

问题是当表单被加载时,myString 是空的。我相信原因是在设置属性 ValueToPass 之前初始化了表单。什么是最好的解决方案?

【问题讨论】:

  • 您可以使用 Userform 的 Activate 事件,或者更好的 IMO,使用该属性来设置标签标题(如果仅此而已)。

标签: vba excel


【解决方案1】:

你打电话的时候可能会这样想:

fm.ValueToPass = "Hello"

Private Sub UserForm_Initialize() 中,myString 值可能在初始化表单之前被传递。例如,您以某种方式期望 myString 可能与 "" 不同(因此您有条件)。情况并非如此 - 首先执行 _Initialize 构造函数,然后执行其他任何操作:

使用您的代码,您需要以某种方式告诉表单,它应该更新其标签。在表单中考虑这一点:

Public Sub ShowForm()

    Me.Label1 = myString
    Me.Show

End Sub

然后在模块中,将其称为fm.ShowForm 而不是fm.Show

实际上,如果您使用用户表单,遵循Model-View-Controller 模式,这是一个好主意。为此,您需要一个单独的课程。

Userform closes after "End Sub" without ever calling "Unload Me"

【讨论】:

    【解决方案2】:

    最简单的方法:

    Sub button()
       Dim fm As New UserForm1
       fm.Label1.Caption = "Hello"
       fm.Show
    End Sub
    

    【讨论】:

    • 感谢您的回复。我应该更清楚的是,这是我真正问题的简化版本。我希望能够传递值,以便我可以根据传递的值对表单进行更重大的更改。我将编辑问题以反映这一点。
    • 那更合理。但是您可以在不显示/加载表单的情况下访问每个对象,因此您应该能够像我在这里所做的那样访问所有对象/属性。
    【解决方案3】:

    您应该为此使用初始化事件:

    Sub OpenForm()
    MyForm.show
    end sub
    

    然后在用户窗体的初始化事件中,放这个:

    Me.LabelName.Caption = "Your label text"
    

    (双击用户窗体查看其代码,然后从右上角的下拉菜单中选择“初始化”。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2020-04-07
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多