根据是否设置了断点,可以生成不同的Access VBA代码

时间:2018-05-01 23:14:28

标签: vba ms-access access-vba

我有一个与Access表单相关的奇怪情况。我有一个父窗体(在单窗体视图中显示),带有子窗体(在连续窗体视图中显示)。父表单为每个项目显示记录(一次一个),子表单显示每个项目的注释(所有这些)。

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

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。

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

无论如何,为了超越这一点,我在更新事件代码之后向组合框添加了一些额外的代码,以便在设置RecordSource之后重新运行定位代码。事情变得奇怪了。这段代码工作正常... 只要我手动单步执行。如果我这样做(设置一个断点并继续按F8),那么它会通过定位代码并让我离开我想去的地方。但是,如果我没有设置断点并让代码自行滚动,它就不起作用。它似乎做了定位,但在它让我控制表格之前它又恢复到初始(坏)子表格位置。

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

我有一般的感觉,根据我是否设置断点但不确定在调试方面何处开始,不同的事件都会触发。任何帮助都非常感激。

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

1 个答案:

答案 0 :(得分:0)

使用子表单的记录集

创建RecordsetClone

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

e.g。

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
相关问题