Access窗体执行查询后Combobox返回错误值问题求助
Access组合框查询后值异常修复方案
问题表现
- 窗体首次加载时,
ReportingMonth组合框显示、取值均正常 - 点击窗体内的查询按钮后,组合框返回异常错乱值
- 已确认逻辑中
ST_Id变量取值始终稳定,手动对组合框执行Requery操作无任何改善 - 组合框的行源(RowSource)通过VBA在
Form_Load事件中动态赋值,原有实现代码如下:
Private Sub Form_Load() dYear = Year(Now) dMonth = Month(Now) getDate = DateSerial(dYear, dMonth + 1, 0) '获取当月最后一天 ST_Id = DLookup("[ID]", "ReportingDays", "[ReportingDay] =#" & Format(getDate, "yyyy\/mm\/dd") & "#") '读取ReportingDays表中匹配的记录ID Forms!frm_Team!ReportingMonth.RowSource = "SELECT ReportingDays.ID, ReportingDays.MonthText FROM ReportingDays " _ & " WHERE ReportingDays.ID > " & ST_Id - 3 & " AND ReportingDays.ID < " & ST_Id + 10 & ";" '给组合框加载选项,范围为当月前2个月至后9个月 End Sub
故障原因
你仅在Form_Load事件中给组合框做了一次动态行源赋值,点击查询按钮时,按钮内的查询逻辑大概率触发了窗体Requery、记录源重绑、筛选切换类操作,这类操作会把控件属性重置为设计视图中保存的默认值,你在加载事件里临时写入的自定义RowSource会被直接覆盖。
此时手动调用Requery方法只会基于已经被重置的默认行源刷新数据,自然无法恢复你自定义的行源规则,所以没有改善效果。
修复步骤
- 把组合框的动态绑定逻辑抽成独立的窗体级过程,不要散写在加载事件中,同时明确指定行源类型避免被意外篡改:
Private Sub BindReportingMonthCombo() Dim dYear As Integer, dMonth As Integer Dim getDate As Date, ST_Id As Long dYear = Year(Now) dMonth = Month(Now) getDate = DateSerial(dYear, dMonth + 1, 0) ST_Id = DLookup("[ID]", "ReportingDays", "[ReportingDay] =#" & Format(getDate, "yyyy\/mm\/dd") & "#") With Me!ReportingMonth .RowSourceType = "Table/Query" .RowSource = "SELECT ReportingDays.ID, ReportingDays.MonthText FROM ReportingDays " _ & " WHERE ReportingDays.ID > " & ST_Id - 3 & " AND ReportingDays.ID < " & ST_Id + 10 & ";" ' 可选:绑定完成后默认选中当月对应选项 .Value = ST_Id End With End Sub
- 在两个位置调用该绑定过程:
- 原有
Form_Load事件中直接调用Call BindReportingMonthCombo - 自定义查询按钮的点击事件中,所有查询逻辑执行完成后,追加调用
Call BindReportingMonthCombo
注意:Access窗体中只要触发Requery、记录源刷新、筛选切换类操作,都可能重置控件的动态属性,不要仅依赖Form_Load事件做一次性的控件属性赋值,涉及动态生成的行源、格式规则,要在所有可能触发重置的操作完成后重新绑定。
内容的提问来源于stack exchange,提问作者NickT2606
相关产品推荐
相关产品推荐

