DoCmd.OpenForm传递的companyFilter未在PROJECT_COMPANY_VIEW更新问题
问题原因及解决方案
核心错误:OpenForm参数位置错误
你当前的过滤条件不生效,最主要的原因是DoCmd.OpenForm的参数传错了位置:DoCmd.OpenForm的第三个参数是FilterName,仅支持传入Access中预先创建保存的筛选器名称,你自定义的COMPANY_ID = xxx这类SQL过滤条件需要放到第四个参数WhereCondition的位置,你之前的代码把过滤条件放到了第三个参数的位置,系统找不到对应名称的预设筛选器,自然不会生效。
修复步骤
第一步:修正跳转代码
将双击事件的代码调整为如下内容,补全参数占位,把过滤条件放到正确的参数位:
Private Sub ProjectTenderList_DblClick(Cancel As Integer) Dim tenderID As Integer Dim companyID As Integer Dim companyFilter As String tenderID = ProjectTenderList.Column(0) companyID = ProjectTenderList.Column(1) companyFilter = "COMPANY_ID = " & companyID ' 第三个参数FilterName留空,第四个参数传入自定义过滤条件 DoCmd.OpenForm "PROJECT_COMPANY_VIEW", , , companyFilter, , , tenderID End Sub
第二步:检查目标表单配置
如果修改代码后仍然不生效,按顺序排查以下配置:
- 打开
PROJECT_COMPANY_VIEW的设计视图,在属性表的「数据」分类下,确认允许筛选属性设置为「是」。 - 检查
PROJECT_COMPANY_VIEW的Form_Open、Form_Load事件代码,确认没有覆盖Filter属性、设置FilterOn = False的逻辑,如果有这类代码,要么删除对应逻辑,要么在事件代码末尾追加Me.FilterOn = True确保传入的筛选生效。
备选解决方案:主动设置筛选
如果上述操作都无法解决,可以换用OpenArgs传值后主动设置筛选,逻辑更可控:
- 跳转代码修改为同时传递companyID和tenderID:
Private Sub ProjectTenderList_DblClick(Cancel As Integer) Dim tenderID As Integer Dim companyID As Integer tenderID = ProjectTenderList.Column(0) companyID = ProjectTenderList.Column(1) ' 用|分隔两个参数放到OpenArgs中 DoCmd.OpenForm "PROJECT_COMPANY_VIEW", , , , , , companyID & "|" & tenderID End Sub
- 在
PROJECT_COMPANY_VIEW的Form_Load事件中添加筛选逻辑:
Private Sub Form_Load() Dim argArray As Variant ' 拆分OpenArgs参数 argArray = Split(Me.OpenArgs, "|") ' 主动设置筛选 Me.Filter = "COMPANY_ID = " & argArray(0) Me.FilterOn = True ' 需要使用tenderID时取argArray(1)即可 End Sub
内容的提问来源于stack exchange,提问作者OutToBrunch
相关产品推荐
相关产品推荐

