我想由位于另一个模块中的Sub修改用户窗体标签的.Caption
。
Private Sub UserForm_Activate()
Dim Vs_Label as string
Label_S.Caption = "something"
Call ChangeLabel(Vs_Label)
Label_S.Caption = Vs_Label
Call ChangeLabel(Label_S.Caption)
end
Sub ChangeLabel(Vs_Label)
Vs_Label = "something else"
end
第一次调用该过程时,它返回Vs_Label
=“其他”。第二次调用该过程时,它返回Label_S.Capiton
=“ something”。
有人可以向我解释这里发生了什么吗?
Sub ChangeLabel(Vs_Label)
首先,通过使所有修饰符和类型都明确显示,使事情更清晰。
Public Sub ChangeLabel(ByRef Vs_Label As Variant)
我们获得了一个名为Vs_Label
的局部变量,其初始值为vbNullString
。
Dim Vs_Label as String Label_S.Caption = "something"
此时Vs_Label
仍为vbNullString
,Label_S.Caption
为“某物”。
Call ChangeLabel(Vs_Label)
现在我们将Vs_Label
变量指针传递给该过程,该过程将其分配给“其他”。请注意,这将是等效的,并且可以说是更简洁的代码:
ChangeLabel Vs_Label
此语句返回后,Vs_Label
是“其他”,而Label_S.Caption
仍然是“其他”。
Label_S.Caption = Vs_Label
现在Vs_Label
和Label_S.Caption
都包含“其他”。
Call ChangeLabel(Label_S.Caption)
此调用现在有所不同:我们不是在传递变量引用,而是在成员表达式中传递。
因此成员表达式得到求值(“其他”),并且对那个值的引用(调用者没有坚持)被传递给过程,该过程将其分配给“其他”。 (不变),然后引用被丢弃:第二次调用无效。
因此,在过程结束时,Vs_Label
和Label_S.Caption
都为“其他”。
为了使标签的Caption
为“某物”,在该代码的末尾,您需要使用其他代码。
在过程(F9)的顶部附近放置一个断点,运行代码,然后使用F8逐步检查并检查标签和变量:您会发现此代码与标签的原因无关说“某事”。
在要查找的两个地方验证您正在使用的表单的哪个实例-并确保两个地方都在同一个对象实例上工作。 Activate
处理程序将运行每次激活表单时-如果未将表单显示为模式对话框,则每个实例可能多次。