You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:45:27