VBA使用全局变量在Access 2010中打开表单的多个实例

时间:2018-08-25 18:14:18

标签: vba ms-access access-vba ms-access-2010

我有一个Cases表格和参加日期,显示我所见过的患者。我正在尝试创建一种方法,通过该方法,我可以双击任何客户的姓名,并且它会打开一个具有更多详细信息的不同表格。我希望能够对多个患者进行此操作,因此,例如,我可以选择并为我今天将要见到的客户打开更详细的表格。

显示摘要详细信息的表单称为CaseAndSessionDetail,更详细的表单称为ClientDetails

我正在使用Windows 8.1下运行的Ms-Access 2010

我已经编写/复制了一个模块,我认为该模块应该通过使用全局变量创建表单集合来完成我想要的工作:

Option Explicit

'This holds the collection of forms as they are created
Global mcolFormInstances As New Collection

Function OpenFormInstance(FormName As String, WhereCondition As String)
    'Declare for name
    Dim frm As form

    Select Case FormName
    Case "ClientDetails"
        Set frm = New Form_ClientDetails
    Case Else
        Debug.Assert False
    End Select
    If WhereCondition <> "" Then
        frm.Filter = WhereCondition
        frm.FilterOn = True
    End If
    ''make the form visible
    frm.Visible = True
    'Need to add a reference to the form so that it does not
    'immediately close when the for variable goes out of scope
    mcolFormInstances.Add (frm)
End Function

如果在最后一行mcolFormInstances.Add(frm)处设置了断点,该函数将起作用并选择并打开/显示正确的客户详细信息表单。没有断点,表单将再次关闭(我怀疑是因为函数结束后变量超出了范围。

作为参考,该函数由宏以"CaseAndSessionDetail"的形式调用

If Not ISNull([Screen].[ActiveControl] Then 
    Function OpenForm("frmContactDetails" = '"& Ltrim([Screen].[ActiveControl]) & "'") 
EndIF

我怀疑我没有正确地将集合对象声明为全局变量。我尝试使用PublicGlobal在单独的模块中以两种形式声明它,但尚未成功。

我意识到我可能忽略了一些非常简单的内容,但是欢迎您提供帮助

1 个答案:

答案 0 :(得分:4)

您的问题只是这一行上一个晦涩的语法错误:

mcolFormInstances.Add (frm)

参数frm周围的括号是围绕参数列表的 not -这就是VBE在.Add和{之间插入空格的原因尝试键入(frm)时为您提供{1}}。这些在语义上是完全不同的。 VBA语言规范的5.6.6节介绍了在此上下文中用括号括起来的表达式:

  

5.6.6带括号的表达式

     

带括号的表达式由一个括在其中的表达式组成   括号。

     

静态语义。带括号的表达式被分类为一个值   表达式,并且包含的​​表达式必须能够被评估为   简单数据值。括号表达式的声明类型为   附带的表达式。

mcolFormInstances.Add(frm)
     

运行时语义。带括号的表达式的计算结果为简单   其封闭表达式的数据值。一个的值类型   括起来的表达式是封闭表达式的表达式。

这意味着您正在将运行时表达式 parenthesized-expression = "(" expression ")" 评估为一种简单的数据类型,并将那个存储在您的frm中。不管实际 的值是多少(我必须检查评估树以得出其评估结果),您都不必增加{ {1}},这将使其超出范围并在Collection退出时被释放。