我正在尝试为表单设置一个验证规则,以查看字段是否已填充并使用当前表单中的字段名称数组进行计算,并且循环将解决此问题而无需太多编码...只是尝试使用循环中的数组值是我的斗争。 (VBA有点新手)
Dim avFields As Variant
Dim vItem As Variant
avFields = Array("inSurvey#", "txtProjectName", "cboPracticeType", "cboProjectType", "cboClient", "txtLaunchDt", "txtEndDt", "cboCRM", "cboPM1", "cboLC1", "cboAN1", "cboCO1", "cboSC1", "cboPRI")
For Each vItem In avFields
Debug.Print vItem
If IsNull(Me.[vbitem]) Then
MsgBox "Please Enter a Project Name", vbOKOnly
Me.[vItem].SetFocus
Exit Sub
End If
Next
我将变量/数组名称放在括号内,以显示我挂断的位置。
谢谢!
答案 0 :(得分:1)
重复How can a reference fields on an Access form using a variable?
您不能在点后使用变量,因为它必须是对象的成员(此处:表单)。您必须使用Controls-Collection,它是表单的成员,并将变量传递给Item-Property Me.Controls.Item(vItem)
,它返回对控件的引用。
If IsNull(Me.Controls(vItem)) Then ' short for Me.Controls.Item(vItem).Value
MsgBox "Please Enter a Project Name", vbOKOnly
Me(vItem).SetFocus ' short for Me.Controls(vItem).SetFocus
Exit Sub
End If
如果您需要通过没有集合的var引用成员,可以使用CallByName函数,如下所示:
Set myControl = CallByName(Me, vItem, vbGet)
更新
我更改了我的代码以包含您的建议,并在字段实际为空时绕过if语句
让我IsNull(Me.myTextBox)
在任何情况下都不可靠。如果要在控件的AfterUpdate事件之前使用Fields输入,则不会设置该值,并且必须使用Me.myTextBox.Text
。
另一个陷阱:Me.myTextBox(.Value)
可以是空字符串""
(与NULL不同)。必须抓住这个:
If Len(Me.Controls(vItem) & vbNullString) = 0 Then ' if control.value is NULL the result string is an empty string (vbNullString is the const for "") as NULL & "" = "". Len() is used instead of Me.Controls(vItem) & vbNullString = vbNullString, because it is faster.