通过连续形式访问循环
Posted
技术标签:
【中文标题】通过连续形式访问循环【英文标题】:Access loop through continuous form 【发布时间】:2017-07-20 13:36:44 【问题描述】:我正在尝试将 VBA 添加到命令按钮以查看文本框,如果不为空,则查看组合框。如果该组合框为空,则弹出一个消息框。由于它是一个连续的表格,并且显示了几条记录,因此它在第一条记录上运行良好,但对于后面的记录就不行了。我相信这是因为我需要遍历每条记录。下面是我到目前为止的 VBA 代码。我非常感谢有关循环的任何帮助,因为我是 VBA 新手。
If Not IsNull(Me.Text33.Value) Then
If IsNull(Me.Combo24.Value) Then
MsgBox "You must state if the rationale is aligned with procedures for each disputed subcategory."
Else
'do nothing
End If
End If
DoCmd.Save
DoCmd.Close
提前谢谢你,
苏珊
【问题讨论】:
您能否通过突出显示代码并按 Ctrl+K 来格式化您的代码 If Not IsNull(Me.Text33.Value) Then If IsNull(Me.Combo24.Value) Then MsgBox "您必须说明理由是否与每个有争议的子类别的程序一致。" Else '什么都不做 End If End If DoCmd.Save DoCmd.Close 抱歉,Ctrl K 不适合我 您希望为连续表单中的所有行(可能是数百或数千)弹出消息框?好像不太人性化!在用户输入数据时对当前记录执行此操作。 最多只能有 10 个,想法是他们会收到一条弹出消息并修复所有行。 【参考方案1】:由于这是一个连续的表单,您可以克隆表单的记录集并在每条记录中循环。
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.MoveLast
rs.MoveFirst
Dim idx As Integer
For idx = 1 To rs.RecordCount
If Not IsNull(rs![TextBoxFieldName]) Then If IsNull(rs![ComboBoxFieldName]) Then MsgBox "..."
rs.MoveNext
Next idx
Set rs = Nothing
With DoCmd
.Save
.Close
End With
请注意,如果这是出于验证目的,DoCmd
操作将始终执行,而不管消息框错误/警告如何。
您可以通过在显示消息框后添加Exit Sub
来更改它。
编辑:
Sub Example()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.MoveLast
rs.MoveFirst
Dim idx As Integer
For idx = 1 To rs.RecordCount
Select Case True
Case Not IsNull(rs![ComboFieldName]) And IsNull(rs![TextBoxFieldName]):
MsgBox "You must enter dispute comments for each disputed subcategory."
GoTo Leave
Case IsNull(rs![ComboFieldName]) And Not IsNull(rs![TextBoxFieldName]):
MsgBox "You must state if the rationale is aligned with procedures for each disputed subcategory."
GoTo Leave
Case Else:
'do nothing
End Select
rs.MoveNext
Next idx
Set rs = Nothing
With DoCmd
.Save
.Close
End With
Exit Sub
Leave:
Set rs = Nothing
End Sub
【讨论】:
谢谢科斯塔斯。看起来好像它不起作用。我没有收到任何错误,但是代码不起作用。以下是我所拥有的,有什么想法吗? Private Sub Command301_Click() Dim rs As DAO.Recordset Set rs = Me.RecordsetClone Dim idx As Integer For idx = 1 To rs.RecordCount If IsNull(Me.Combo24) = False Then If IsNull(Me.Text33) Then MsgBox "You必须为每个有争议的子类别输入争议 cmets。” Else End If End If Next idx Set rs = Nothing With DoCmd .Save .Close End With End Sub 您需要将Me.Combo24
和Me.Text33
更改为答案中显示的实际数据库字段,例如rs![FieldName]
。您可以在每个控件的Control Source
属性中找到字段名称。
谢谢,我现在就试试。
它仍在关闭表单,没有任何弹出消息框。
在 Sub 中放置一个断点并用 F8 浏览代码以查看它的作用。它会循环吗?以上是关于通过连续形式访问循环的主要内容,如果未能解决你的问题,请参考以下文章