我可以使用变量作为MS Access表单中字段的名称吗?

时间:2018-03-08 21:54:49

标签: vba forms access

我正在尝试为表单设置一个验证规则,以查看字段是否已填充并使用当前表单中的字段名称数组进行计算,并且循环将解决此问题而无需太多编码...只是尝试使用循环中的数组值是我的斗争。 (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

我将变量/数组名称放在括号内,以显示我挂断的位置。

谢谢!

1 个答案:

答案 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.