我试图将全局变量的名称传递给子例程,并想知道如何引用它。例如,我可以使用控件执行以下操作:
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) 结束子
第二次编辑:
似乎我绝对会在这里咆哮错误的树,所以我会解释我想要实现的目标。
我有一个包含用户(风险)地址文本框的表单,顶部有一个复选框,允许用户选择此地址与系统上已有的“联系人”详细信息相同,文本框为锁定。
填充文本框很好并且有效。我使用全局变量的是提高可用性(虽然略有提高)。 用户可以添加新的详细信息,如果他们点击“与联系人相同”复选框,他们输入的详细信息将存储在全局变量中,每个控件都有一个。
如果用户通过点击复选框出错,则他们没有丢失这些值,并且通过取消选中该框,将返回输入的值。 我希望创建一个子例程,我可以传递全局变量的名称并控制和调用此例程,而不是为每个控件写出它。
我有一种感觉,我可能会使用错误的技术来实现我的目标。但是在回答我原来的问题时,似乎你不能以我希望的方式将全局变量传递给子例程。
答案 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。如果这个字段在结尾处是真的 - 那么我清理(当然可能是所有记录或一些文件)。很容易。