本节摘要:Access 的独特红利在于与 Word、Excel、Outlook 同门共居:数据源一键交付邮件合并,汇总一键变成透视底稿,提醒自动飞进收件箱。本节给出三套拿来即改的联动模板并标明各自的适用场合。
选 Access 的很多团队,真实动因其实是这一节的内容。数据孤岛时代最贵的是人肉搬运:从数据库抄到 Word、把统计结果誊进 Excel、照着名单一个个发通知。同在 Office 屋檐下意味着这些墙全都提前拆好了。
场景:华彩每月要给欠款客户寄催款函。过去小王开一封模板、填一次户名金额,一家五分钟。Access 姿势如下:
第一次配置十分钟,此后每月只做两件事:跑一下查询刷新名单,点一下合并按钮。二十家客户的函件三分钟出齐。
两个实战细节让它更稳:金额显示加格式开关 { MERGEFIELD 欠款额 \# "#,##0.00" } 避免出现一长串小数;日期字段同样有专属格式开关,不设的话会按美式月日年给你表演国际玩笑。
老板娘的丈夫是 Excel 重度患者,坚信一切分析都要回到工作簿。与其说服他,不如供粮。Access 这边两条管道可选:
效果叠加后华彩的实际分工变成了这样:明细、约束、口径维护住在 Access 里;趋势图、假设分析、模拟运算表留给 Excel。两边各干擅长的事,再没人问"为什么你们俩做出来的数不一样"——因为源头只剩一个。
5.3 结尾答应过的完整案例来了:低库存超过三天的货品,让系统自己写邮件提醒采购员。核心代码一段拿下:
Sub 发缺货提醒() Dim rst As DAO.Recordset Dim appOut As Object, mailIt As Object ' 后期绑定 不勾引用也能跑 On Error GoTo 兜底 Set appOut = CreateObject("Outlook.Application") Set rst = CurrentDb.OpenRecordset( "SELECT 品名 安全库存 现有量 FROM 货品 WHERE 现有量 < 安全库存", dbOpenSnapshot) Do While Not rst.EOF Set mailIt = appOut.CreateItem(0) ' 0 代表普通邮件 mailIt.To = "purchasing@huacai.demo" mailIt.Subject = "补货提醒 " & rst!品名 mailIt.Body = "现有量 " & Nz(rst!现有量, 0) & _ " 已低于安全线 " & rst!安全库存 & _ " 请安排补货。 ——库存管家" mailIt.Send ' 直接入发件箱 rst.MoveNext Loop 收尾: Set mailIt = Nothing: Set appOut = Nothing Exit Sub 兜底: MsgBox "邮件环节出错 请检查收件箱程序是否可用" End Sub
值得圈点的工程细节有三处。后期绑定:用 CreateObject 创建对象而不是先去引用对话框打勾,好处是机器上就算装了不同版本的 Office 都不会因引用版本错位而崩;Send 与 Display 的分寸:Send 直接投递适合无人值守,调试阶段请先用 Display 弹出来人工过目——全自动系统的第一原则是可观察;批量信的礼貌:几十封连发建议在循环里隔批 DoEvents 放缓节奏,别触发邮箱服务方的频率保护。
把这段挂上 AutoExec 宏(5.1 学的名字魔法),再配一个每日条件判断,一个晨报机器人就诞生了——采购部到现在都以为我给他们开了什么高价外挂。
协同虽好,三个越界动作要拦住:
问:Word 里金额合并出来一长串小数怎么办? 按下 Alt 加 F9 显示域代码,在金额域后面补上格式开关(\# "0.00"),日期用 \@ "yyyy年M月d日",数码立刻变规矩。这两个开关是邮件合并界的常用小抄,建议连同域快捷键一起打印贴屏。
问:备注为空时函件里留下一行尴尬的空白怎么办? 问题源头在查询——合并文档只会照搬数据,清洗要在数据侧完成:查询里加一个表达式列 IIf(Len(Nz(备注,""))=0,"","备 注:" & 备注),空白时整行退场。
问:老板新装的 BI 工具能不能直接连我们的库? 第 8 章会讲直连通道;眼下先提醒一句口径问题——BI 自由探索出来的统计与系统里盖章的报表若对不上号,信任危机比性能问题麻烦十倍。过渡期的稳妥做法:BI 只读我们导出的快照,正式数字以系统报表为准,等口径梳理完再放开直连。
邮件合并的字段内容直接来自查询输出,所以"合并文档漂不漂亮"的一半责任在数据侧。三个查询层预处理让函件质量立刻上一个台阶:日期统一在查询里 Format 成中文习惯写法,别把 ISO 格式原样丢给打印机;地址拆成省市区三列就先串接成完整一行再加"收";金额保留两位并以千分位分隔——这些加工放在查询里一次完成,比在每个 Word 模板里重复设置域开关省心得多。数据侧准备得越干净,模板侧的自由度才越大。
下一节把镜头拉远:当同事坐到了另一个城市,这些本地功夫怎么延展。