【问题标题】:Global variable loses value after userform全局变量在用户表单后失去价值
【发布时间】:2022-05-16 19:24:30
【问题描述】:

我知道有几个类似的问题,但恐怕他们的答案都不能解决我的问题。

我创建了一个简单的文件来测试问题。 Sheet1 中的代码:

Public aaa As String

Sub abc()
    UserForm1.Show
    Debug.Print aaa
End Sub

UserForm1 中的代码:

Private Sub CommandButton1_Click()
    aaa = TextBox1.Text
    Debug.Print aaa
    Unload UserForm1
End Sub

我逐行运行代码,卸载前的 Debug.Print 工作正常;并且公共 var 在卸载用户表单后立即失去其价值。 我尝试将卸载更改为隐藏,但没有成功。无论如何,全局 var 的值都会丢失。

我认为这个测试文件足够简单,可以避免任何问题...谁能告诉我为什么全局变量不能保持其值?谢谢。

【问题讨论】:

  • 添加新模块并将aaa变量移入其中。
  • 恐怕“公共变量”甚至没有被使用... VBA 创建了一个新的 Variant 变量并使用它。请尝试将Option Explicit 放在表单代码模块的顶部。您必须在标准模块中声明Public 变量,以便在不提及工作表代码名称的情况下访问...或尝试Sheet1.aaa = TextBox1.Text。它不能失去它没有的东西。
  • 谢谢大家,现在我知道我的代码出了什么问题。

标签: excel vba


【解决方案1】:

没有任何变量会“失去”它的价值。您的问题来自表单模块中的 aaa 和表单中的 aaa 是不同的变量。这是为什么呢?

a) 表格类似于类。如果您在工作表模块中声明Public aaa As String,则可以在该工作表模块中使用其名称访问它。在该模块之外,您需要指定对象,例如sheet1.aaa

b) 因此,在表单代码中,变量aaa 是未知的。您似乎不使用Option Explicit,VBA 运行时将动态创建它并将文本框的内容分配给它。

所以在工作表中定义的变量aaa 永远不会被触及。您可以通过在打开表单之前在 abc 例程中为其分配任何内容来轻松证明这一点,并在表单代码中检查 aaa - 您将看不到任何内容。返回abc时,原来的内容还在。

你能做什么? 如前所述,您可以在代码中使用sheet1.aaa

另一种方法是将 aaa 的声明移动到常规模块中(我的建议是将 Sub abc 也移动到该模块中 - 工作表代码应该只包含事件处理程序)。在常规模块中定义的aaa 将是一个在表单代码中也已知的全局变量。

为避免此类问题,您应该使用Option Explicit。这样,编译器会告诉您 aaa 在表单模块中未定义。

【讨论】:

  • 感谢您的详尽解释!
【解决方案2】:

在我的情况下,我在模块和另一个模块中留下了同名的变量,用于初始化全局变量。希望能帮助一些迷失的灵魂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多