全局变量失去其价值

时间:2013-07-11 19:37:15

标签: vba ms-access ms-access-2000

在我正在处理的这个Access表单上,我有一个全局变量,它在Form_Load事件中从另一个表单获取其值。由于某些原因我不知道变量“失去它的值”(变成=“”)经过一段时间后或某些事件发生。我无法注意到触发此行为的任何特定内容。在表单上“不活动”一段时间后全局变量是否重置?

以下是我如何设置我正在讨论的全局变量:

Private Sub Form_Load()       
    '...
    Set prev_form = Form_Identification.Form
    PasswordSybase = prev_form.Password.Value & vbNullString
    UserSybase = prev_form.UserID.Value & vbNullString
    '...
End Sub

5 个答案:

答案 0 :(得分:8)

另一种解决方案(仅限2007及之后)我开始使用的是TempVars而不是全局数,而奇怪的情况是我“需要”全局的东西。它是一个集合,它会在应用程序持续时间内持续存在,除非您明确发布它。因此,在某些情况下,我认为它比全局变量更有用,在某些情况下更糟糕。

TempVars.Add myVarName, myVarValue ' To initialize
TempVars.Item(myVarName) = newVarValue ' To reference and assign a new value
TempVars.Remove(myVarName) ' To release

快速搜索应该会显示更多批次参考,但我已经包含了基本链接的链接

http://blogs.office.com/b/microsoft-access/archive/2010/09/27/power-tip-maximize-the-user-of-tempvars-in-access-2007-and-2010.aspx

答案 1 :(得分:6)

我希望访客看到这篇文章,因为它提供了一个重要的附加部分。

即使你全局声明一个变量,如果你在表单模块中设置了该变量的值,它就会显示 - 当你卸载表单时该值会丢失。

解决方案(在我的情况下)就像更换一样简单:

卸载我

...与...

Me.Hide

我在该代码模块中设置的变量(和对象)然后在应用程序实例的整个生命周期中保留它们的值。

答案 2 :(得分:2)

这可能会有所帮助: https://accessexperts.com/blog/2011/01/12/multi-session-global-variables/ Juan Soto解释了如何使用本地表来保存变量以及如何在需要时调用它们。它可能在2000年服务于你的目的,因为TempVars不是一个选择。您可以随时删除数据库“关闭”的变量,以便不保留UID和PWD。

答案 3 :(得分:1)

您可以通过

创建“假”全局变量
  • 创建表单(例如名为frmGlobal)
  • 确保表单始终处于打开状态但隐藏
  • 为您想要的每个全局变量创建一个TextBox(例如tVar1)
  • 在您的代码中,引用为例如Form_frmGlobal.tVar1

缺点是未绑定的文本框可能无法为您提供所需的特定数据类型

这两种方式是

  • 在您的代码中,在引用全局变量时显式地将文本框转换为数据类型 例如Clng(Form_frmGlobal.tVar1)

  • 另一个选项是创建一个单行表并将隐藏表单上的文本框绑定到表中,以便强制执行数据类型

此方法的一个好处是可以用于会话之间的持久存储 警告:确保此表仅在单个用户的本地,在前端数据库文件中(由于多用户相互覆盖,因此不希望将其放在后端数据库中)。这假设您正在使用前端+后端分离的数据库,并将前端分配给每个用户的工作站。

答案 4 :(得分:0)

我在那个声明中没有看到任何告诉我它是全局变量的声明。您可以通过声明:

将全局变量设置在模块中的所有子/函数和选项比较语句下方
PUBLIC X as string

任何其他变量只有在子或函数完成之后才有效。

此外,全局变量必须在PROPER MODULE上声明。您无法在表单模块中声明它们。