如何访问Access中的选定行?

kar*_*ins 8 ms-access vba selection

我有一个包含数据表的表格.我想让用户可以选择多行,单击一个按钮并运行一些SQL查询并对这些行执行一些工作.

查看我的VBA代码,我看到如何使用CurrentRecord属性访问最后选择的记录.但我不知道如何知道在多个选择中选择了哪些行.(我希望我很清楚......)

这样做的标准方法是什么?访问VBA文档在网上有点模糊......

谢谢!

DJ.*_*DJ. 9

我使用了类似于JohnFx的技术

要在选择高度消失之前捕获它,我在Main表单中使用了子窗体控件的Exit事件.

所以在主要形式:

Private Sub MySubForm_Exit(Cancel As Integer)

  With MySubForm.Form
    m_SelNumRecs = .SelHeight
    m_SelTopRec = .SelTop
    m_CurrentRec = .CurrentRecord
  End With

End Sub
Run Code Online (Sandbox Code Playgroud)

  • 这比表单Timer事件优雅高效多了!如果需要在 SubForm 上运行代码,则可以在同一 Exit 事件处理程序中从父窗体调用 SubForm 的公共方法:MySubForm.Form.PublicMethod。SelHeight 和 SelTop 值在该方法执行期间仍然有效。这种模式的好处是,因为工作代码位于 SubForm 模块中,所以如果 SubForm 位于多个父窗体上,它将可以重用......因此父窗体上的重复代码很少。 (2认同)

Joh*_*nFx 8

这是执行此操作的代码,但有一个问题.

Private Sub Command1_Click()
     Dim i As Long
     Dim RS As Recordset
     Dim F As Form

     Set F = Me.sf.Form
     Set RS = F.RecordsetClone

     If F.SelHeight = 0 Then Exit Sub

     ' Move to the first selected record.
     RS.Move F.SelTop - 1

     For i = 1 To F.SelHeight
       MsgBox RS![myfield]
       RS.MoveNext
     Next i

End Sub
Run Code Online (Sandbox Code Playgroud)

这里有一个问题: 如果代码被添加到按钮中,只要用户单击该按钮,选择就会在网格中丢失(selheight将为零).因此,您需要捕获该信息并使用计时器或表单上的其他事件将其保存到模块级变量.

这篇文章描述了如何详细解决这个问题.
http://www.mvps.org/access/forms/frm0033.htm

捕获2:这仅适用于连续选择.他们无法在网格中选择多个非连续行.

更新:
可能有一个更好的事件来捕获它,但这是一个使用我测试的form.timerinterval属性的工作实现(至少在Access 2k3,但2k7应该工作正常)

此代码在SUBFORM中,使用该属性获取主表单中的selheight值.

Public m_save_selheight As Integer

Public Property Get save_selheight() As Integer
    save_selheight = m_save_selheight
End Property

Private Sub Form_Open(Cancel As Integer)
    Me.TimerInterval = 500
End Sub

Private Sub Form_Timer()
    m_save_selheight = Me.selheight
End Sub
Run Code Online (Sandbox Code Playgroud)