提问人:ebsf 提问时间:9/21/2023 更新时间:9/25/2023 访问量:82
访问 VBA:公共过程的可选参数默认值中的 Me 关键字?
Access VBA: Me Keyword in Public Procedure's Optional Argument Default Value?
问:
是否可以在 VBA 中使用关键字来定义公共过程的可选参数的默认值?在谷歌上搜索一两个小时没有得到任何指导。Me
Access 前端中存在多个参数/搜索表单。其中每个窗体都有一个组合框或列表框 (cboTargetForm),用于将另一个窗体指定为目标窗体。每个窗体的代码隐藏模块中的相同代码将此控件的值分配给字符串变量,如下所示:
strTargetForm = Me.cboTargetForm
Me
当然,在代码隐藏模块中并不困难,但现在,目标是将这些模块的冗余代码重构为标准模块中的单个公共过程。显然,此控件的值必须作为参数传递给公共过程。同时,每个窗体上的控件名称都是相同的,因此具有默认值的可选参数非常有意义。
目前的想法是将公共功能定义为:
Sub UpdateTargetForm(strString As String, Optional strTargetForm As String = Me.cboTargetForm)
Sub UpdateTargetForm(strString As String, Optional frmMe As Access.Form = Me)
或者,也许是上述任何一项,同时引用包含 .Me
问题是这些或类似的东西是否有效。
答:
在 VBA 过程中定义参数的默认值时,必须为其指定一个常量。由于 Me 不是一个常数,因此它不能在那种情况下使用。Optional
如果希望标准模块中的过程引用打开的窗体,则无论窗体实例是否作为参数传递,请参阅 Screen.ActiveForm 是否令人满意。
Public Sub MyProcedure(Optional varFrm As Variant)
Dim frmTarget As Form
If IsMissing(varFrm) Then
Set frmTarget = Screen.ActiveForm
Else
Set frmTarget = varFrm
End If
Debug.Print frmTarget.Name
End Sub
另请参阅 Screen.ActiveControl,以防它在预期应用程序中更有用。
评论
Screen.ActiveForm
是解决方案。正如您所建议的那样,我一直在考虑传递表单实例,但我真正需要的只是对它及其控件之一的临时引用。无论如何,这几乎是一个标准模块可以管理的全部内容。感谢。
答案很简单,它指的是对象的当前实例,在标准模块中是无效的,因为后者无法实例化。 当然,可以在类模块中使用,但需要注意的是,它指的是该类的当前实例,而不是可能已传递给该类的任何其他对象。Me
Me
在这种情况下,解决方法是在标准模块的代码中使用 Screen.ActiveForm,正如其他人所建议的那样。这可能是一个单独的指针,但它很快就会超出范围。
评论
Me
在标准模块中无效。这就是你要问的吗?Forms!formname.cboTargetForm