【问题标题】:VBA controls reference (form) global variables?VBA控制引用(表单)全局变量?
【发布时间】:2015-02-07 10:50:38
【问题描述】:

好的,我已经有几个版本没有使用 Access 编程了,但我可以发誓我曾经能够将控件指向表单全局变量。示例代码如下:

Option Compare Database
Option Explicit
Dim Testvar As String

Private Sub Form_Load()
Testvar = "Load"
End Sub

Private Sub Form_Open(Cancel As Integer)
Testvar = "open"
End Sub

Private Sub Text0_Click()
Testvar = "settest"
End Sub

我应该能够在控件上放置一个可以看到 TestVar 变量的文本框,但是控件不这样做。另外,我以前可以使用表单的记录源来做到这一点。

所以,问题 - 我疯了吗——这不可能吗? 还是我忘记了如何填写表格?

然后是最重要的问题 - 解决此问题的最佳方法是什么?
最常用的方法是传入 OpenArgs(在这种情况下为记录键),然后将其解析为全局变量,然后几个控件显示打开的 args 和/或查找要从键显示的值。

我真的很讨厌必须构建例程来重建和加载控件的记录源。希望有人知道更好的方法

【问题讨论】:

  • 您是否尝试将文本框绑定到模块级变量?
  • 没错。我原以为控件至少能够“看到”变量。即使它可能不允许直接绑定。
  • @alanTuring 您必须在常规模块中而不是在表单模块中声明 global 变量。将其声明为public myGlobal as String,然后它就可以在所有模块中访问。
  • @vbaforall - 我不想为表单特定值声明全局变量。在表单级别声明的 var 应该可用于表单上的所有对象。

标签: forms ms-access vba global-variables


【解决方案1】:

除了现有的事件过程之外,您还可以在表单模块中添加一个函数,该函数检索 Testvar 模块变量的值。

Function GetTestvar() As String
    GetTestvar = Testvar
End Function

然后使用=GetTestvar()作为Text0的控制源。

【讨论】:

  • 好吧,这大概就是我所记得的。本着 OOP 的最佳精神,具有用于形成外部引用的 put 和 get 函数。这在我的实际情况下工作得很好 - 一个带有 dlookup 的字段如下 - =DLookUp("LookupDesc","vlookup","LookupGroup='FUNS' And LookupID= '" & GetFunctID() & "'")
  • 不确定您为什么要谈论外部参考。我修改了这个答案以澄清我的意图是在表单的代码模块中创建函数。
  • 好吧,有点“离题”——使用函数从另一个“对象”中获取值是非常 OOPie。在一个非常正式的编码模型中,另一个模块需要的任何值都应该用“get”来调用。我只是认为这是一个非常好的方法。
【解决方案2】:

您必须实际设置文本框的值。没有办法(据我所知)将文本框绑定到变量。

Option Compare Database
Option Explicit

Private Sub Form_Load()
    Text0.Value = "Load"
End Sub

Private Sub Form_Open(Cancel As Integer)
    Text0.Value = "open"
End Sub

Private Sub Text0_Click()
    Text0.Value = "settest"
End Sub

当然,您可以将值存储在变量中并使用它来设置值,但在这个简单的示例中这样做没有什么意义。

【讨论】:

  • 老鼠。我可以发誓可以在控件中引用变量。随它吧。谢谢,伙计们
【解决方案3】:

TempVars 集合是 Access 2007 中引入的一项功能。因此,如果您的 Access 版本 >= 2007,您可以使用 TempVar 来保存字符串值。然后,您可以使用 TempVar 作为文本框的控制源。

使用=[TempVars]![Testvar] 作为Text0 的控制源,以下事件过程会按照您的要求执行。

Private Sub Form_Open(Cancel As Integer)
    TempVars.Add "Testvar", "Open"
End Sub

Private Sub Form_Load()
    TempVars("Testvar") = "Load"
End Sub

Private Sub Text0_Click()
    TempVars("Testvar") = "settest"
    Me.Text0.Requery
End Sub

注意:[TempVars]![Testvar] 将在会话的剩余时间内在整个应用程序中可用。如果这是您遇到的问题,您可以在 Form Close 处删除 TempVar:TempVars.Remove "Testvar"

【讨论】:

  • 这是一种非常巧妙的方法。我没有意识到你可以用 TempVars 做到这一点。需要注意的是,TempVars 在整个应用程序中都可用,因此如果有很多控件使用此方法,这可能会有点混乱。它们也仅在 Access 中可用(或参考 Access)。 ++
  • 是的,我添加了一个警告。谢谢。
  • @HansUp - 这看起来是一个相当可行的解决方案。 TempVar 在范围内是全局的,我不关心,但它们确实具有我正在寻找的属性。感谢您的提示 - 我从未听说过 TempVars。
  • @alanTuring 我明白了,所以添加了另一个可能更接近您想要的答案。
【解决方案4】:

要求是:在应用程序的所有表单上显示应用程序用户的登录 ID。

我是这样实现的:

Create a module: module_init_globals
with the following code:

Option Compare Database

'Define global variables

Global GBL_LogonID as string

Option Explicit

Public Sub init_globals ()

   'Initialize the global variables

   'Get_Logon_Name is a function defined in another VBA module that determines the logon ID         of the user

    GBL_LogonID = Get_Logon_Name()

 End Sub


On the main/first form - we need to call the module that will initialize the global variables:

In the code for "on open" event I have:

Private Sub Form_Open (Cancel as Integer)
   call init_globals
End Sub




then on each of the forms in the app, I have a text control - txtUserID to display the  logon id of the user

and I can set it's value in the "on open" event of the form.

txtUserID.value = GBL_LogonID

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2017-04-22
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多