使用表单属性在“用户表单”上设置值

时间:2018-01-31 13:14:43

标签: excel vba excel-vba

如果已经问过这个问题,我似乎无法找到答案。我想在UserForm上设置一些东西,因为它是根据从属性传递给它的值加载的。我所拥有的是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之前初始化了表单。什么是最好的解决方案?

3 个答案:

答案 0 :(得分:1)

最简单的方法:

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

答案 1 :(得分:1)

当你打电话时,你可能会认为:

fm.ValueToPass = "Hello"

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

enter image description here

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

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 :(得分:0)

你应该使用initialize事件:

Sub OpenForm()
MyForm.show
end sub

然后在userform的initialize事件中,输入:

Me.LabelName.Caption = "Your label text"

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