您可能希望研究创建自定义集合,然后将它们传递给您的函数。我在表单中广泛使用它们来验证控件。假设您在表单的模块级别定义了此集合:
Dim mcolDateFields As New Collection
然后在表单的 OnLoad 事件中,您可以这样做:
mcolDateFields.Add Me!txtDateEntered, "txtDateEntered"
mcolDateFields.Add Me!txtDatePrinted, "txtDatePrinted"
mcolDateFields.Add Me!txtDateArchived, "txtDateArchived"
要遍历该集合,您需要执行以下操作:
Dim varItem As Variant
Dim ctl As Control
For Each varItem In mcolDateFields
Set ctl = varItem
Debug.Print ctl.Name & ": " & ctl.Value
Next varItem
Set ctl = Nothing
...您可以将 Debug.Print 替换为实际有用的东西。
您还可以将控件传递给其他将集合作为参数的代码例程并对其进行处理:
Public Sub (mcolCollection As Collection)
Dim varItem As Variant
Dim ctl As Control
For Each varItem In mcolCollection
Set ctl = varItem
Debug.Print ctl.Name & ": " & ctl.Value
Next varItem
Set ctl = Nothing
End Sub
这可能允许您传递要验证的控件集合。由于您将控件引用存储在集合中,而不是控件名称或控件值,因此无需传递父表单名称。如果您需要它,您可以通过以下方式获得它:
Dim varItem As Variant
Dim ctl As Control
For Each varItem In mcolCollection
Set ctl = varItem
Debug.Print ctl.Parent.Name & "!" & ctl.Name & ": " & ctl.Value
Next varItem
Set ctl = Nothing
同样,如果您想以与在表单自己的模块中使用 Me 关键字相同的方式使用表单,只需使用 ctl.Parent,如果控件位于表单本身上,它将返回表单引用 (而不是,比如说,在选项卡控件上)。
您的代码示例中的一些 cmets - 您的第一个示例如下所示:
Private Sub ExampleProc1()
Dim intCancel as Integer
intCancel = False
Me.Controls("Date1").Value=Null
Me.Controls("Textfield1").Value=Null
Call Date1_BeforeUpdate(intCancel)
Call Textfield1_BeforeUpdate(intCancel)
End Sub
虽然在您创建可取消事件时它被定义为整数,但实际上根本不是 - 它是一个布尔值,要取消事件,您必须将其设置为 True (-1)。我认为这实际上是 Access VBA 在 VBA 之前的 Access 时代的保留,当时 Access Basic 缺少布尔数据类型。一般来说,我只对与 Cancel 参数一起使用的变量使用布尔值。
Me.Controls("Date1").Value=Null
我不知道你为什么要这样做。我会这样编码:
Me!Date1 = Null
您的代码过于冗长,因为您两次指定了默认值:Controls 集合是表单的默认集合。实际上,默认集合是 Controls 和 Fields 集合的串联,因此指定您要使用控件可能有充分的理由,例如,如果您正在使用相应字段缺少的控件属性。但是对于操作值,如果有一个与字段同名的控件,则使用哪个值并不重要,因为它们将是相同的,除非在极不可能的情况下,控件实际上并未绑定到该字段同名。
同样,.Value 是控件的默认属性,因此没有理由指定它。您可能想要这样做的唯一情况是,如果您将它用作调用另一个例程的参数,其中参数是 ByRef 而不是 ByVal。但一般来说,如果只是给控件赋值,就很浪费打字。
要完成您想要完成的工作,在我看来,控件引用的集合是一个很好的解决方案。不过,我不知道这些控件的事件是否需要公开。