Access 2007连续窗体无记录时控件Active状态读取错误问题
MS Access 2007连续窗体筛选控件Change事件错误处理
问题背景
使用MS Access 2007的连续窗体,页眉区域包含“应用筛选”按钮和名为cmpCercaCognome的控件(用于查找姓氏)。在该控件的Change事件中,当筛选条件有结果时功能正常,但无筛选结果时会触发错误2185 - 无活动状态无法读取控件...。
错误代码片段
Private Sub cmpCercaCognome_Change() If (ActiveControl.Name = "cmpCercaCognome") Then LunghStr = Len(Me.cmpCercaCognome.Text) else LunghStr = Len(Me.cmpCercaCognome) End if 'Something else but I dont reach it end sub
错误场景
点击cmpCercaCognome控件输入字符设置筛选条件时,明明已判定ActiveControl为该控件,但读取.Text属性时仍报错。
已尝试的无效方案
添加Me.RecordsetClone.RecordCount > 0的判断条件,仅在记录数大于0时执行代码,但此时只能获取控件的.Value属性,无法读取刚输入的临时字符,不符合需求。
解决方案
方案1:使用Screen.ActiveControl替代Me.ActiveControl并结合错误捕获
当窗体记录集为空时,Me.ActiveControl可能失效,但Screen.ActiveControl是系统层面的焦点控件,不受窗体记录集状态影响。同时通过错误捕获处理极端情况:
Private Sub cmpCercaCognome_Change() Dim LunghStr As Integer Dim targetCtrl As Control ' 获取当前系统焦点控件 On Error Resume Next Set targetCtrl = Screen.ActiveControl On Error GoTo 0 If Not targetCtrl Is Nothing And targetCtrl.Name = "cmpCercaCognome" Then ' 优先读取临时输入的Text属性,失败则 fallback 到Value On Error Resume Next LunghStr = Len(targetCtrl.Text) If Err.Number = 2185 Then LunghStr = Len(Nz(targetCtrl.Value, "")) End If On Error GoTo 0 Else LunghStr = Len(Nz(Me.cmpCercaCognome.Value, "")) End If ' 执行后续筛选逻辑 End Sub
方案2:直接尝试读取控件属性,简化判断逻辑
由于Change事件由当前控件触发,可直接尝试读取.Text属性,失败则自动切换到.Value,无需判断ActiveControl:
Private Sub cmpCercaCognome_Change() Dim LunghStr As Integer On Error Resume Next ' 尝试读取临时输入的Text属性 LunghStr = Len(Me.cmpCercaCognome.Text) ' 捕获2185错误,改用Value属性 If Err.Number = 2185 Then LunghStr = Len(Nz(Me.cmpCercaCognome.Value, "")) End If On Error GoTo 0 ' 执行后续筛选逻辑 End Sub
关于“让临时值立即生效”的说明
若要让临时输入值直接同步到.Value属性,可在Change事件中添加赋值语句,但需注意:
- 如果控件绑定到数据表字段,此操作会直接修改对应记录,可能产生意外数据变更;
- 如果是未绑定的筛选控件,可使用以下代码,但频繁赋值可能影响性能:
Me.cmpCercaCognome.Value = Me.cmpCercaCognome.Text
内容的提问来源于stack exchange,提问作者EskevarMkDrake
相关产品推荐
相关产品推荐

