【问题标题】:Different Access VBA code results depending on whether breakpoint is set不同的Access VBA代码结果取决于是否设置断点
【发布时间】:2018-05-02 08:17:53
【问题描述】:

我遇到了一个与 Access 表单相关的奇怪情况。我有一个父表单(显示在单一表单视图中)和一个子表单(显示在连续表单视图中)。父表单显示每个项目的记录(一次一个),子表单显示每个项目的注释(全部)。

notes 子表单可以为每个项目记录包含数十或数百条记录。为了方便用户在他们拉出记录时立即开始在表单中输入注释,我在父表单的当前事件中有代码“定位”子表单中的记录以显示底部的四个现有记录然后他们可以开始输入文本的记录。该代码如下所示:

Dim mymove As Integer
Dim c As Integer

'' Attempt to scroll down in the CaseNotes subform to a convienent location
'' so that user can read the most recent note and has access to the next
'' blank note
With Me.CaseNotes.Form.Recordset

    ' Load the # of notes for this record
    c = .RecordCount

    ' The display shows only 5 notes.  Otherwise, you have to scroll.
    ' If there are more than 4 notes, we want to display just the last
    ' four and then have a blank line where a new note can be entered.
    ' The following code makes the moves necessary for this.
    If c <= 4 Then mymove = c Else mymove = 4

    If mymove > 0 Then
      .MoveLast
      .Move -mymove
    End If

    'move to new record
    .AddNew

End With

这段代码已经工作了一百万年,一般来说没有问题。但是,最近我们向父窗体添加了一个组合框控件,允许用户为父窗体选择数据源。该组合框的更新后事件会根据用户选择的值更改父表单的 RecordSource。

一旦我们实现了这一点,我们的定位代码在您更改数据源后将不再有效。因此,您选择了一个新数据源,它将新数据加载到父表单和子表单上,然后注释子表单正确定位自身(使用上面的代码),但在将控制权交给用户之前,它恢复到音符的原始(坏)位置。不清楚为什么。定位代码正在运行(我设置了一个断点并单步执行了代码),但它正在以某种方式撤消。

无论如何,为了智取这一点,我在组合框的 after update 事件代码中添加了一些额外的代码,以便在设置 RecordSource 后重新运行定位代码。这就是事情变得奇怪的地方。这段代码运行良好...只要我手动执行它。如果我这样做(设置断点并继续按 F8),那么它将通过定位代码并将我留在我想要的位置。但是如果我不设置断点,只是让代码自己滚动,它就行不通。它似乎进行了定位,但在它让我控制表单之前,它又恢复到初始(坏)子表单位置。

那里似乎完全没有区别。在一种情况下,我手动执行,而在另一种情况下,代码只是自行运行。我认为它应该给出相同的结果。为什么这会产生不同的结果,我可以做些什么来解决这个问题?

我有一些普遍的感觉,不同的事件会根据我是否设置断点来触发,但在调试方面甚至不确定从哪里开始。任何帮助都非常感谢。

如果有用的话,我正在 Windows 7 上运行 Access 2013 32 位。

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    使用子表单的记录集创建 RecordsetClone

    然后在通过克隆记录集中的代码导航后, 将子表单的书签设置为与克隆的书签相同。

    例如

    Dim rsClone As Recordset
    Dim intMoveBack As Integer
    Dim intCount As Integer
    
    Set rsClone = Me.CaseNotes.Form.RecordsetClone
    intMoveBack = 4
    
    
    If Not (rsClone.EOF And rsClone.BOF) Then  'there is at least one record in the subform
    
        rsClone.MoveLast
    
        For intCount = 1 To intMoveBack - 1
            If Not (rsClone.BOF) Then
                rsClone.MovePrevious
            End If
        Next
    
        If rsClone.BOF Then   'we have moved back past the first record, so step forward one
            rsClone.MoveNext
        End If
    
        Me.CaseNotes.SetFocus   'setfocus to the subform
    
        With Me.CaseNotes.Form
            .Bookmark = rsClone.Bookmark
            .AnyControlOnYourSubform.SetFocus   'replace this with the name of a control on your subform
            .Recordset.AddNew
        End With
    
    End If
    

    【讨论】:

    • 完全相同的行为。如果我单步执行它会起作用,但如果我让代码运行则不起作用。
    • 听起来可能有另一个事件触发?例如你的子窗体的 OnCurrent?如果是这样,“退出子”或“退出函数”就在其他事件 VBA 代码的顶部(只是临时添加这些行,作为测试),因为上面引用的上述代码在我模拟的示例中本身就可以正常工作向上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多