通过连续形式访问循环

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.Combo24Me.Text33 更改为答案中显示的实际数据库字段,例如rs![FieldName]。您可以在每个控件的Control Source 属性中找到字段名称。 谢谢,我现在就试试。 它仍在关闭表单,没有任何弹出消息框。 在 Sub 中放置一个断点并用 F8 浏览代码以查看它的作用。它会循环吗?

以上是关于通过连续形式访问循环的主要内容,如果未能解决你的问题,请参考以下文章

opencv之访问图像像素

STM32能通过按键中断实现连续按键吗

更新表单上的复选框时,以连续形式访问 oldValue 以在 beforeUpdate 中生成错误 3251

五顺序表

信号与系统4.连续时间CT系统

Shopify Liquid:连续 for 循环无序迭代