Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Vba 使用表单属性在用户表单上设置值_Vba_Excel - Fatal编程技术网

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

Vba 使用表单属性在用户表单上设置值,vba,excel,Vba,Excel,如果已经有人问过这个问题,我会问,但我似乎找不到答案。我想在UserForm上设置一个dosomething,因为它是基于从属性传递给它的值加载的。我在Excel工作表上有一个按钮,它按如下方式加载用户表单: Sub button() Dim fm As New UserForm1 fm.ValueToPass = "Hello" fm.Show End Sub 表格后面是以下代码: Private myString As String Public Property

如果已经有人问过这个问题,我会问,但我似乎找不到答案。我想在UserForm上设置一个dosomething,因为它是基于从属性传递给它的值加载的。我在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
之前初始化的。最好的解决方案是什么?

最简单的方法:

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

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

Sub OpenForm()
MyForm.show
end sub
然后在userform的initialize事件中,输入以下内容:

Me.LabelName.Caption = "Your label text"

(双击userform以查看其代码,然后从右上角的下拉列表中选择“初始化”。

您可能认为在调用时:

fm.ValueToPass = "Hello"
Private Sub-UserForm\u Initialize()
中,有可能在初始化表单之前传递
myString
值。例如,您不知何故期望
myString
可以是与
”不同的东西(因此您有这种情况)。情况并非如此-首先执行
\u Initialize
构造函数,然后执行其他任何操作:

对于代码,您需要以某种方式告诉表单,它应该更新其标签。在表格里面考虑这个:

Public Sub ShowForm()

    Me.Label1 = myString
    Me.Show

End Sub
然后在模块中,像
fm.ShowForm
那样调用它,而不是
fm.Show

实际上,如果您使用userforms,遵循该模式,这是一个好主意。为此,您需要一个单独的类


感谢您的回复。我应该更清楚,这是我真正问题的简化版本。我希望能够传递值,以便根据传递的值对表单进行更重要的更改。我将修改这个问题以反映这一点。这更合理。但是您可以访问每个对象,而无需显示/加载表单,因此您应该能够像我在这里所做的那样访问所有对象/属性。您可以使用Userform的激活事件,或者,在我看来,更好的是,使用属性设置标签标题,如果这就是它的全部用途。