Ms access MS Access VBA可设置连续窗体子窗体的滚动条位置

Ms access MS Access VBA可设置连续窗体子窗体的滚动条位置,ms-access,vba,ms-access-2013,Ms Access,Vba,Ms Access 2013,我有一个带有子窗体的窗体。子窗体是一个连续窗体,因此我可以使用条件格式。使用选项卡控件中的控件,更改子窗体上当前选定记录的值。因此,我重新查询子表单以更新子表单连续表单以显示更新的数据 我可以在子窗体中重新选择正确的记录,但该记录在列表中的位置会跳到子窗体列表的顶部,而不是保持更新前的位置 我已尝试使用子窗体的CurrentSectionTop值,但在重新查询子窗体后,我无法在子窗体中正确保持用户的选择位置 是否有办法获取子表单的连续表单的滚动条位置的当前位置,然后在连续表单重新查询后在代码中设

我有一个带有子窗体的窗体。子窗体是一个连续窗体,因此我可以使用条件格式。使用选项卡控件中的控件,更改子窗体上当前选定记录的值。因此,我重新查询子表单以更新子表单连续表单以显示更新的数据

我可以在子窗体中重新选择正确的记录,但该记录在列表中的位置会跳到子窗体列表的顶部,而不是保持更新前的位置

我已尝试使用子窗体的CurrentSectionTop值,但在重新查询子窗体后,我无法在子窗体中正确保持用户的选择位置

是否有办法获取子表单的连续表单的滚动条位置的当前位置,然后在连续表单重新查询后在代码中设置该位置?(Stephen Lebans的代码(请参阅:)不适用于我,因为我使用的是Access 2013,他的代码不会转换为Access 2013)

下面是当记录7是当前选中的记录时,子窗体连续窗体显示的示例:
{连续表单视图的开始}
[]在连续表单视图中记录3
[]连续表单视图中的记录4
[]在连续表单视图中记录5
[]在连续表单视图中记录6
[>]连续表单视图中的记录7
[]在连续表单视图中记录8
[]在连续表单视图中记录9
{连续表单视图的结尾}
{制表符控件显示在下面的连续窗体子窗体下方}

重新查询子窗体后,下面是子窗体连续窗体显示的外观,但我希望显示的外观与上面相同;显示器不应将记录7作为连续表单视图中的顶部记录,因为它最初是视图中的第五条记录,所以我希望它是重新查询后的第五条记录:
{连续表单视图的开始}
[>]连续表单视图中的记录7
[]在连续表单视图中记录8
[]在连续表单视图中记录9
[]在连续表单视图中记录10
[]连续表单视图中的记录11
[]在连续表单视图中记录12
[]在连续表单视图中记录13
{连续表单视图的结尾}

{tab control显示在连续表单子表单下方}

以下代码是Stephen Lebans网站上代码的子集:。该链接有一个指向Access数据库压缩版本的链接,其中包含处理多个场景的所有代码,但是该数据库是旧版本,需要转换。勒班先生的代码所做的远远超过了这里所包含的内容,但我仅使用此代码来解决一个特定问题

(A) 创建名为“clsSetRow”的类模块并粘贴到以下代码中:

Option Compare Database
Option Explicit

Private mSelTop As Long
Private mCurrentSectionTop As Long

Public Property Get SelTop() As Long
SelTop = mSelTop
End Property

Public Property Let SelTop(x As Long)
mSelTop = x
End Property


Public Property Get CurrentSectionTop() As Long
CurrentSectionTop = mCurrentSectionTop
End Property

Public Property Let CurrentSectionTop(x As Long)
mCurrentSectionTop = x
End Property
(B) 在表单的模块中,在顶部包括以下内容:

Private SR As clsSetRow
Dim lCurRec As Long
(C) 添加以下事件处理程序和代码:

Private Sub Form_Load()
Set SR = New clsSetRow
End Sub
Private Sub Form_Current()
' This event can be called during the Form Load event prior to the init of
' our class so we must test for this.
If Not SR Is Nothing Then
    SR.SelTop = Me.SelTop
    SR.CurrentSectionTop = Me.CurrentSectionTop
End If
End Sub
Private Sub Form_AfterInsert()    ' OR JUST USE THE BEFOREINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "After Insert, Current: " & Me.CurrentRecord
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)   ' OR JUST USE THE AFTERINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "Before Insert, Current: " & Me.CurrentRecord
End Sub
(D) 无论您想在何处重新定位(即重新查询后),请添加以下代码行:

 DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, lCurRec       
(E) 要测试这一点,只需添加一个命令按钮,该按钮将“重新查询,然后转到记录”

注意:仅使用滚动条向上或向下滚动不会保存您所在位置的行!您需要建立一个“当前记录”,以便重新定位


祝你好运!谢谢斯蒂芬·勒班的密码

以下代码是Stephen Lebans网站上代码的子集:。该链接有一个指向Access数据库压缩版本的链接,其中包含处理多个场景的所有代码,但是该数据库是旧版本,需要转换。勒班先生的代码所做的远远超过了这里所包含的内容,但我仅使用此代码来解决一个特定问题

(A) 创建名为“clsSetRow”的类模块并粘贴到以下代码中:

Option Compare Database
Option Explicit

Private mSelTop As Long
Private mCurrentSectionTop As Long

Public Property Get SelTop() As Long
SelTop = mSelTop
End Property

Public Property Let SelTop(x As Long)
mSelTop = x
End Property


Public Property Get CurrentSectionTop() As Long
CurrentSectionTop = mCurrentSectionTop
End Property

Public Property Let CurrentSectionTop(x As Long)
mCurrentSectionTop = x
End Property
(B) 在表单的模块中,在顶部包括以下内容:

Private SR As clsSetRow
Dim lCurRec As Long
(C) 添加以下事件处理程序和代码:

Private Sub Form_Load()
Set SR = New clsSetRow
End Sub
Private Sub Form_Current()
' This event can be called during the Form Load event prior to the init of
' our class so we must test for this.
If Not SR Is Nothing Then
    SR.SelTop = Me.SelTop
    SR.CurrentSectionTop = Me.CurrentSectionTop
End If
End Sub
Private Sub Form_AfterInsert()    ' OR JUST USE THE BEFOREINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "After Insert, Current: " & Me.CurrentRecord
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)   ' OR JUST USE THE AFTERINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "Before Insert, Current: " & Me.CurrentRecord
End Sub
(D) 无论您想在何处重新定位(即重新查询后),请添加以下代码行:

 DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, lCurRec       
(E) 要测试这一点,只需添加一个命令按钮,该按钮将“重新查询,然后转到记录”

注意:仅使用滚动条向上或向下滚动不会保存您所在位置的行!您需要建立一个“当前记录”,以便重新定位


祝你好运!谢谢斯蒂芬·勒班的密码

以下代码是Stephen Lebans网站上代码的子集:。该链接有一个指向Access数据库压缩版本的链接,其中包含处理多个场景的所有代码,但是该数据库是旧版本,需要转换。勒班先生的代码所做的远远超过了这里所包含的内容,但我仅使用此代码来解决一个特定问题

(A) 创建名为“clsSetRow”的类模块并粘贴到以下代码中:

Option Compare Database
Option Explicit

Private mSelTop As Long
Private mCurrentSectionTop As Long

Public Property Get SelTop() As Long
SelTop = mSelTop
End Property

Public Property Let SelTop(x As Long)
mSelTop = x
End Property


Public Property Get CurrentSectionTop() As Long
CurrentSectionTop = mCurrentSectionTop
End Property

Public Property Let CurrentSectionTop(x As Long)
mCurrentSectionTop = x
End Property
(B) 在表单的模块中,在顶部包括以下内容:

Private SR As clsSetRow
Dim lCurRec As Long
(C) 添加以下事件处理程序和代码:

Private Sub Form_Load()
Set SR = New clsSetRow
End Sub
Private Sub Form_Current()
' This event can be called during the Form Load event prior to the init of
' our class so we must test for this.
If Not SR Is Nothing Then
    SR.SelTop = Me.SelTop
    SR.CurrentSectionTop = Me.CurrentSectionTop
End If
End Sub
Private Sub Form_AfterInsert()    ' OR JUST USE THE BEFOREINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "After Insert, Current: " & Me.CurrentRecord
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)   ' OR JUST USE THE AFTERINSERT
    lCurRec = Me.CurrentRecord
    'Debug.Print "Before Insert, Current: " & Me.CurrentRecord
End Sub
(D) 无论您想在何处重新定位(即重新查询后),请添加以下代码行:

 DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, lCurRec       
(E) 要测试这一点,只需添加一个命令按钮,该按钮将“重新查询,然后转到记录”

注意:仅使用滚动条向上或向下滚动不会保存您所在位置的行!您需要建立一个“当前记录”,以便重新定位


祝你好运!谢谢斯蒂芬·勒班的密码

以下代码是Stephen Lebans网站上代码的子集:。该链接有一个指向Access数据库压缩版本的链接,其中包含处理多个场景的所有代码,但是该数据库是旧版本,需要转换。Leban先生的代码所做的远远超过这里所包含的内容,但我只使用此代码来解决一个特定的问题