Access中空查询网格下如何将焦点设置到指定列?
问题描述
在Access中创建窗体,以acReadOnly模式打开查询qryTest1(语句:select field1,field2,field3 from myTable)。通过窗体按钮将焦点设置到查询网格的特定列时,查询有记录时代码正常运行,但空记录时执行dataSheet.Controls("Field2").SetFocus会触发错误2105:“无法转到指定记录”。需要解决空查询网格中设置焦点到特定列的问题。
原代码:
主模块
' main module Option Compare Database Option Explicit Sub start() DoCmd.OpenForm "frmtest" End Sub
窗体模块
' frmTest module Option Compare Database Option Explicit Dim dataSheet As Object Private Sub Form_Load() DoCmd.OpenQuery "qryTest1", acViewNormal, acReadOnly ' qryTest1: select field1,field2,field3 from myTable Set dataSheet = Screen.ActiveDatasheet End Sub Private Sub cmdSetFocus_Click() dataSheet.SetFocus MsgBox dataSheet.SelTop dataSheet.Controls("Field2").SetFocus End Sub
解决方案
空查询网格没有实际记录行,直接调用控件的SetFocus会因无可用记录触发错误。可以通过设置数据表的SelColumn属性来指定焦点列,该属性不受空记录影响。
修改按钮点击事件代码如下:
Private Sub cmdSetFocus_Click() dataSheet.SetFocus With dataSheet.Recordset ' 判断是否为空记录集 If .EOF And .BOF Then ' 获取目标列的索引(Access列索引从1开始) Dim targetColIndex As Integer targetColIndex = dataSheet.Controls("Field2").Column ' 设置焦点到目标列 dataSheet.SelColumn = targetColIndex Else ' 有记录时使用原方法 dataSheet.Controls("Field2").SetFocus End If End With End Sub
关键说明
- 用
EOF和BOF同时判断记录集为空是最可靠的方式,避免RecordCount属性在某些记录集类型下的不准确问题。 Controls("Field2").Column获取目标列在数据表中的位置索引(从1开始计数)。SelColumn属性直接控制数据表的焦点列,即使没有记录,也会将焦点定位到该列的虚拟空白行上,不会触发错误。
内容的提问来源于stack exchange,提问作者Miroslaw
相关产品推荐
相关产品推荐

