Access VBA添加的报表条件格式在打印预览中不显示的问题及解决方法
问题:Access报表VBA添加的条件格式在打印预览中不生效
我使用VBA为Access报表添加条件格式,该格式在报表视图(Report View)中正常显示,但直接以打印预览(Print Preview)打开报表时却不生效(除非先打开报表视图再切换到预览)。通过向导添加的条件格式则可在打印预览中正常显示。
我使用的是Office365 Access 2208版本,具体设置为:通过表单让用户输入日期,将该日期作为OpenArg传递给报表,代码如下:
Private Sub cmd_Ok_Click() 'DoCmd.OpenReport "Component Value", acViewPreview, , , , Me.txt_Date <- Does not show conditional formatting DoCmd.OpenReport "Component Value", acViewReport, , , , Me.txt_Date DoCmd.Close acForm, Me.Name, acSaveNo End Sub
随后在报表的OnLoad事件中添加格式条件,代码如下:
Dim strCondDate As String Private Sub Report_Load() If Not IsNull(Me.OpenArgs) Then strCondDate = Me.OpenArgs End If If Not IsNull(strCondDate) Then With Me.txt_Updated.FormatConditions With .Add(acExpression, , "[Last Updated] < #" & strCondDate & "#") .BackColor = vbYellow End With End With End If End Sub
我通过断点确认,直接以打印预览打开报表时该代码正常运行,但格式并未显示。请问为何会出现这种情况?如何让格式在打印预览中正常显示?
原因分析
- Access打印预览模式的渲染时机与报表视图不同:
Report_Load事件在打印预览初始化时虽会执行,但此时报表的格式化引擎已完成初始布局,动态添加的条件格式无法被应用到已渲染的内容上。 - 向导添加的条件格式属于报表设计的预存规则,打印预览启动时会直接读取并应用,因此能正常生效。
解决方法
方法1:切换视图模式(临时方案)
保留现有代码逻辑,打开报表视图后立即切换到打印预览,让格式规则先在报表视图中生效再同步到预览:
Private Sub cmd_Ok_Click() DoCmd.OpenReport "Component Value", acViewReport, , , , Me.txt_Date DoCmd.Close acForm, Me.Name, acSaveNo ' 切换至打印预览 DoCmd.OpenReport "Component Value", acViewPreview End Sub
注:此方法可能会出现短暂的视图切换闪烁。
方法2:改用Report_Open事件添加格式
将添加条件格式的代码移至Report_Open事件,该事件在报表开始渲染前触发,能确保格式规则被提前加载:
Dim strCondDate As String Private Sub Report_Open(Cancel As Integer) If Not IsNull(Me.OpenArgs) Then strCondDate = Me.OpenArgs End If If Not IsNull(strCondDate) Then With Me.txt_Updated.FormatConditions ' 清除已有条件格式,避免重复添加 .Delete acConditionAll With .Add(acExpression, , "[Last Updated] < #" & strCondDate & "#") .BackColor = vbYellow End With End With End If End Sub
之后直接以打印预览模式打开报表即可:
Private Sub cmd_Ok_Click() DoCmd.OpenReport "Component Value", acViewPreview, , , , Me.txt_Date DoCmd.Close acForm, Me.Name, acSaveNo End Sub
方法3:结合预定义格式与参数传递(更稳定)
通过向导预先添加条件格式,结合查询参数传递日期,避免动态添加格式的时机问题:
- 在报表设计界面,用向导为
txt_Updated添加条件格式,表达式设置为[Last Updated] < [Forms]![你的表单名称]。 - 直接以打印预览模式打开报表:
Private Sub cmd_Ok_Click() DoCmd.OpenReport "Component Value", acViewPreview, , , , Me.txt_Date DoCmd.Close acForm, Me.Name, acSaveNo End Sub
如果需要同时筛选记录,也可以在打开报表时指定筛选条件:
Private Sub cmd_Ok_Click() DoCmd.OpenReport "Component Value", acViewPreview, , "[Last Updated] < #" & Me.txt_Date & "#" DoCmd.Close acForm, Me.Name, acSaveNo End Sub
内容的提问来源于stack exchange,提问作者S Meredith
相关产品推荐
相关产品推荐

