VBA将用户窗体控件作为参数传递

问题描述 投票:2回答:1

我想由位于另一个模块中的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”。

有人可以向我解释这里发生了什么吗?

vba word-vba external userform caption
1个回答
1
投票
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仍为vbNullStringLabel_S.Caption为“某物”。

Call ChangeLabel(Vs_Label)

现在我们将Vs_Label变量指针传递给该过程,该过程将其分配给“其他”。请注意,这将是等效的,并且可以说是更简洁的代码:

ChangeLabel Vs_Label

此语句返回后,Vs_Label是“其他”,而Label_S.Caption仍然是“其他”。

Label_S.Caption = Vs_Label

现在Vs_LabelLabel_S.Caption都包含“其他”。

Call ChangeLabel(Label_S.Caption)

此调用现在有所不同:我们不是在传递变量引用,而是在成员表达式中传递。

因此成员表达式得到求值(“其他”),并且对那个值的引用(调用者没有坚持)被传递给过程,该过程将其分配给“其他”。 (不变),然后引用被丢弃:第二次调用无效。

因此,在过程结束时,Vs_LabelLabel_S.Caption都为“其他”。

为了使标签的Caption为“某物”,在该代码的末尾,您需要使用其他代码。

在过程(F9)的顶部附近放置一个断点,运行代码,然后使用F8逐步检查并检查标签和变量:您会发现此代码与标签的原因无关说“某事”。

在要查找的两个地方验证您正在使用的表单的哪个实例-并确保两个地方都在同一个对象实例上工作。 Activate处理程序将运行每次激活表单时-如果未将表单显示为模式对话框,则每个实例可能多次。

© www.soinside.com 2019 - 2024. All rights reserved.