本节摘要:报表是给纸面和归档准备的结构化输出,核心机制是"节":页眉页脚管版式、组页眉组页脚管分块小计。本节从零搭出华彩的月结对账单——按客户分组、每组小计、期末总计,顺带讲清它与窗体、查询三者的分工边界。
财务周姐的需求单写得很具体:"我要一张能盖章的月结对账单,每个客户一块,下面小计,最后一页合计,格式别乱跳。"翻译成技术语言就是:分组报表带层级聚合。
新手常问:都能显示数据,报表和窗体到底差在哪?我的区分标准简单粗暴:
第三条尤其值得强调:报表的数据源应该是第 3 章做好的汇总查询(比如那个品类交叉表或对账明细),而不是裸表。这样口径集中在查询层管理,同一口径既能上屏又能上纸,不会出现"屏幕一个数纸张另一个数"的事故。
打开报表设计视图,最先要建立的是"节"的心智模型。一条典型分组报表自上而下的条带:
报表结构七条带 从上到下 报表页眉 只在首页顶部 出现一次 放总标题 公司抬头 页面页眉 每页顶端 放列标题 行名 组页眉 每个分组开头 放组标识 客户名称 主体 每行记录 放明细字段 数据行 组页脚 每个分组结尾 放该客户小计 页面页脚 每页底部 放页码 打印日期 报表页脚 全部末尾 放总计 制单人签字位
理解了条带就理解了报表的全部布局魔法:某个元素出现在错误位置(比如合计跑到每页重复),九成是放错了节。布局问题的排查动作永远是把出事的控件拖回它该在的条带里。
第一步建数据源。新建一个名为"对账明细"的选择查询,联接订单、明细、货品三张表,输出列含客户名称、业务单号、下单日期、品名规格、数量、成交单价、金额表达式列,条件限定目标月份(用 3.3 的参数插槽 Between [开始日期] And [结束日期])。
第二步向导起手又立功了。创建选"报表向导"→ 数据源对账明细 → 分级字段选客户名称 → 排序加下单日期 → 汇总选项勾"仅汇总"里的求和与平均 → 布局选"阶梯" → 完成。向导自动生成了组页眉、组页脚和两个文本框表达式,快得让人愧疚。
第三步手工精修三处:
=Sum([金额])——Sum 在组页脚里算的是本组,落在报表页脚则自动变成全表总计,同一个函数换个条带含义随之改变,这是节模型最优雅的地方;="第 " & [Page] & " 页 / 共 " & [Pages] & " 页",周姐特别要求了这个;第四步真实打印验收。预览模式检查三件事:跨页时列标题是否完整(页面页眉生效)、小组是否被腰斩(把组的属性"保持同页"设为整个组)、数字右对齐没有。尤其第二项最显专业度——某个客户五十行明细被拆到两页各一半,是最常被纸质报表使用者吐槽的细节。

条件格式让异常自己报警:明细行的金额控件上加规则"当订单状态等于作废时整行灰显斜杠",纸面上也能一眼识别已作废但仍在历史里的单据;库存报表同理可以给低于安全线的行染红。规则在报表属性的条件格式对话框配置,本质是把 3.2 学过的 IIf 判断可视化了。
子报表处理一纸多段:月报常常上半页是销售汇总、下半页是费用清单,两段数据源不同。办法是在主报表合适位置放入子报表控件,各自绑定各自查询。克制使用——超过三段的拼贴应该考虑分成多张独立报表,纸是给人读的,不是塞沙丁鱼的罐头。
纸质输出也有自己的工程问题,各记一件。
性能这件:给周姐的月结单跑了一次全量后发现首屏预览要等十几秒。诊断过程和第 3 章如出一辙——真正的病根是报表记录源直接挂了三层嵌套查询。处理方式也简单:把最重的那层换成事先生成的快照查询,再把不展示的列从 SELECT 里剔除,预览回落到两秒内。经验值得重复一遍:报表永远不要以原始大表为源,让它以一个口径明确的专用查询为源,速度和正确性同时受益。
口径这件:财务对账单差点闹出一场误会。打印出来 Total 比她们账面少了几十块,追查半天是"金额"字段没把运费行算进去——明细查询的过滤条件本该排除作废单却没排。这类纠纷没有技术难度,只有纪律难度:每一份对外报表的记录源查询都要注明口径,最好连"含不含税、截止到几号"写进报表页眉的小字里。数字对不上的争吵,九成始于口径没人负责。
问:能不能让用户点按钮就批量打出全部客户的结账单? 可以,宏或 VBA 里 OpenReport 时给条件参数按客户循环即可,第 5 章的组合拳正适合收编这个需求。
问:屏幕上看得好好的,打印出来字体为什么挤了? 屏幕用系统缩放、打印机用自己的分辨率,边距设置不当就会被裁。正式模板务必在真实打印机上走一遍——预览通过从来不是终点。
打印不是终点。周姐后来提出月结对账单还要发微信群里存档,于是又多了两段标配动作:
转 PDF 一句话的事。 用输出宏或一行 VBA 把指定报表落成 PDF 文件(输出格式参数填成 PDF 那一项),版式与打印机上所见完全一致,手机上点开即读。比起截图或拍照,PDF 归档半年后依然检索得到。
批量导出配命名纪律。 循环出每家客户的对账单属于第 5 章的组合拳范围,但命名规则现在就该定:客户名加年月的文件名模板固定下来,接收方设文件夹规则自动归类——发得规整,对方才存得住。
顺带一提灰度建议:正式启用电子分发前先并行跑一个月,让财务对着纸版和 PDF 各核对一轮。单据形态变更类的调整,多花的一个月永远比事故后的解释便宜。
最后把你按笔画一遍的流程收成一句行动纲领:先定查询定口径,再让向导出骨架,然后手工摆条带,接着纸面验收防断组,最后配好 PDF 出口。五个环节各管一类事故,跳步的人会以更贵的方式把课补回来——尤其前两步。"报表是从查询长出来的",这句话在新手听来是比喻,在第 3 章打底充分的你眼里应该就是施工图。
录入了也打印了,最后一步是把这些功能装订成一个"像软件"的门面——导航。