引用全局变量 - MS Access

时间:2010-07-16 15:45:36

标签: ms-access vba ms-access-2007

我试图将全局变量的名称传递给子例程,并想知道如何引用它。例如,我可以使用控件执行以下操作:

Private Sub passCtrlName(ctlName as String)
Me.Controls(ctlName) = "Whatever"
End Sub

编辑:

例如

Public imGlobVar As String
Public Sub passGlobVar(frm as Form, ctlName as String, globVar as String)
frm.Controls(ctlName) = globVar
End sub

并称之为     私有子imaButton_Click()     imGlobVar =“某事”     调用passGlobVar(Me,txtBox1,imGlobVar)     结束子

第二次编辑:

似乎我绝对会在这里咆哮错误的树,所以我会解释我想要实现的目标。

我有一个包含用户(风险)地址文本框的表单,顶部有一个复选框,允许用户选择此地址与系统上已有的“联系人”详细信息相同,文本框为锁定。

填充文本框很好并且有效。我使用全局变量的是提高可用性(虽然略有提高)。 用户可以添加新的详细信息,如果他们点击“与联系人相同”复选框,他们输入的详细信息将存储在全局变量中,每个控件都有一个。

如果用户通过点击复选框出错,则他们没有丢失这些值,并且通过取消选中该框,将返回输入的值。 我希望创建一个子例程,我可以传递全局变量的名称并控制和调用此例程,而不是为每个控件写出它。

我有一种感觉,我可能会使用错误的技术来实现我的目标。但是在回答我原来的问题时,似乎你不能以我希望的方式将全局变量传递给子例程。

4 个答案:

答案 0 :(得分:2)

您不需要传递全局变量,只需按名称引用它们即可。请注意,如果发生未处理的错误,则会重置全局变量。

http://msdn.microsoft.com/en-us/library/dd897495(office.12).aspx中,您将找到关于变量和常量的范围和生命周期的部分。

在一个模块中:

Option Explicit 
Public glbVarName As String
Const MyConstant=123

Sub InitVar
   glbVarName="Something"
End Sub

任何其他模块,包括表单的类模块:

Sub SomeSub
    MsgBox glbVarName
    SomeVar=2+MyConstant
End Sub

答案 1 :(得分:1)

如果您询问是否可以使用包含变量名称的字符串动态引用全局变量,则答案为否。您可以使用单个全局数组并传递索引,这将允许您动态引用数组的元素。

<强> [编辑]
回答问题中的澄清:当用户选中复选框时,您可以将每个控件的值保存到其Tag属性。然后,如果用户取消选中该复选框,您只需循环控件并将Tag的值分配回控件的Value

答案 2 :(得分:1)

您可以使用控件名称作为字典键,将控件中的值存储在Dictionary对象中。然后,您可以根据控件的名称检索每个控件的值。

Option Compare Database
Option Explicit

Const cstrMyControls As String = "Text0,Text2,Text4,Text6"
Dim objDict As Object

Private Sub chkToggle_Click()
    If Me.chkToggle = True Then
        Call SaveValues
    Else
        Call RestoreValues
    End If
End Sub

Private Sub SaveValues()
    Dim varControls As Variant
    Dim i As Long

    Set objDict = Nothing 'discard previous saved values '
    Set objDict = CreateObject("Scripting.Dictionary")
    varControls = Split(cstrMyControls, ",")
    For i = 0 To UBound(varControls)
        objDict.Add varControls(i), Me.Controls(varControls(i)).Value
    Next i
End Sub

Private Sub RestoreValues()
    Dim varControls As Variant
    Dim i As Long
    If objDict Is Nothing Then
        'MsgBox "No values to restore." '
    Else
        varControls = objDict.keys()
        For i = 0 To UBound(varControls)
            Me.Controls(varControls(i)).Value = objDict(varControls(i))
        Next i
    End If
End Sub

答案 3 :(得分:-1)

我在表中使用了附加字段 - 名称取消 - 当然是布尔 - 当我不确定字段的内容是否有效时我将其设置为true。如果这个字段在结尾处是真的 - 那么我清理(当然可能是所有记录或一些文件)。很容易。