【问题标题】:VBA passing userform controls as parametersVBA 将用户窗体控件作为参数传递
【发布时间】:2020-04-04 22:57:32
【问题描述】:

我想让位于另一个模块中的 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 = "something else"。 第二次调用该过程时,它返回 Label_S.Capiton= "something"。

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

【问题讨论】:

  • @Warcupine Vs_Label 参数(隐式)传递给 ByRef,因此调用者确实看到了新值。
  • 该声明毫无意义,第二次调用ChangeLabel 绝不会导致标题为“其他”以外的任何内容。 OP 一定在这里遗漏了重要的部分。
  • 第二次调用不是将变量传递给函数,而是传递一个属性。可能是原因。属性返回一个临时变体/字符串女巫然后传递给子,所以只有临时变量被修改,而不是属性值。
  • @VincentG 是正确的。 ByRef 指针实际上丢失了,第二次调用没有任何副作用。
  • 旁注,其工作是获取某个表单上标签的标题的过程,可能应该在该表单的代码隐藏中。在 UI 代码中保留 UI 问题!

标签: vba ms-word external userform caption


【解决方案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 仍然是vbNullString,而Label_S.Caption 是“某物”。

Call ChangeLabel(Vs_Label)

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

ChangeLabel Vs_Label

此语句返回后,Vs_Label 是“somethign else”,Label_S.Caption 仍然是“something”。

Label_S.Caption = Vs_Label

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

Call ChangeLabel(Label_S.Caption)

这个调用现在不同了:我们传入的不是变量引用,而是一个成员表达式。

因此成员表达式被评估(“其他东西”),并且对那个值的引用(调用者没有保留)被传递给过程,过程将它分配给“别的东西”(没有变化),......然后引用被丢弃:第二次调用没有任何效果。

所以在过程结束时,Vs_LabelLabel_S.Caption 都是“其他东西”。

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

在过程顶部附近放置一个断点 (F9),运行代码,然后使用 F8 逐步检查并检查您的标签和变量:您会发现这段代码与为什么标签上写着“某事”。

在您正在查看的两个地方验证您正在使用的表单实例 - 并确保两个地方都在使用相同的对象实例。 Activate 处理程序将在每次激活表单时运行 - 如果表单没有显示为模式对话框,那么每个实例可能会运行多次。

【讨论】:

  • 谢谢,马修。我的理解是否正确,没有办法通过外部过程直接更改 UserForm 控件的值,通过将它们作为参数传递?
  • 当您将foo.Bar 作为参数传递给接收ByRef 参数的过程时,无法进行ByRef 分配,因为您正在传递 属于foo.Bar,而不是指向foo 对象的Bar 属性的指针。
  • 也就是说,UI 问题应该在 UI 代码中处理 - 标准模块无法对某些表单的标签或任何其他控件做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2010-12-15
相关资源
最近更新 更多