本节摘要:Access 生在 Windows 的组件世界(COM)里,注定是双向的:它既是宿主,能调用文件系统、外部程序乃至自己写的组件;也是乘客,能被 Excel、Power BI、后台脚本当作一个数据源或自动化对象来驱动。看懂这两条通道和各自的坑,你的系统就从"单机应用"升格为"企业数据的一个节点"。
上一节往里看透了引擎,这一节往外看边界。华彩项目第三年遇到的两个典型诉求都很常见:财务希望在 Excel 里直接刷新出最新库存做透视分析;老板让机器上挂着的报表订阅每天早上八点自动把日报发进群里(邮件发送交给现成的办公自动化工具)。这两个诉求一个要别人进来取数,一个要我们出去配合调度——正好覆盖本节的全部内容。
COM(组件对象模型)是 Windows 世界运转了几十年的协作约定:程序把功能封装成对象彼此调用。Access 在这场游戏里的身份很特殊,两边都占:
作为容器,它能驱动大量现成对象。VBA 一句 CreateObject 就能让文件系统替你拷贝备份、让 Excel 替你生成图表、让正则引擎替你清洗文本。你在第 5 章已经用过 DAO 与 Excel 对象,其实那是同一套机制的两个实例。
作为零件,整个 Access 应用本身是一个可编程对象。任何装了 ACE 引擎的机器上的脚本都可以启动它、打开某个库、运行某个宏、生成某份报表再关闭——全程无人值守。第 6 章导出时用的菜单命令,背后就是这套自动化接口。
| 你处在哪一边 | 典型场景 | 用到的关键对象 |
|---|---|---|
| Access 调用别人 | 备份拷贝、生成 Excel 台账、读注册表项 | FileSystemObject、Excel.Application |
| 别人驱动 Access | 夜间自动打报表、批量导入、被 BI 取数 | Application 对象、OLE DB 提供程序 |
出门侧讲三个层次,代价与威力递增。
最常用层:借用现成组件。 拷贝备份文件到带日期的子目录,两行搞定:
' 压缩修复前先把现有后端复制一份存档 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile "\\nas\share\华彩后端.accdb", _ "\\nas\backup\华彩后端_" & Format(Date, "yyyymmdd") & ".accdb"
这类 Scripting 对象每台 Windows 都有,零部署成本,是桌面数据库运维的主力外援。
谨慎使用层:Windows API 直调。 VBA 的 Declare 语句可以直接申请操作系统底层函数,比如读取当前登录用户名、弹出特殊的对话框。威力大,但没有安全网——参数给错一步就可能让 Access 当场消失。原则是:能用组件解决的就不碰 API;必须用时把调用封装在一个自写函数里,全项目只允许这一个入口。
定制开发层:ActiveX 控件与自己写的 DLL。 华彩仓库后来想用扫码枪直接录货号,采购了一个条码控件拖进窗体即插即用;更复杂的场景(自家加密算法)则可以请人写个 COM 组件供 VBA 调用。这条路通向真正的定制,但要留意 32 位与 64 位匹配问题——本节末尾详说。
进门侧是企业环境里更高频的需求:辛苦维护的数据,凭什么别的工具不能直接用?答案当然是能,而且方式比多数人想的简单。
外部程序经 OLE DB 或 ODBC 读库。 只要目标机器装了 ACE 引擎(装 Office 就有),任何语言都能连过来查询:
' 外部工具使用的连接字符串模板(以 Excel 的 Power Query 或 ADO 为例) Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\nas\share\华彩后端.accdb; Persist Security Info=False;
财务的诉求十分钟即可满足:Excel 数据选项卡新建连接指向这个串,选 tblStock 表,之后每次刷新透视图拿到的都是实时库存。Power BI 同理,把 accdb 当成普通数据源接入即可。
脚本驱动整个应用程序。 需要不只是取数、还要跑流程时(比如按既定参数生成月报并导出 PDF),外部脚本能把 Access 当提线木偶操作:创建 Access.Application 实例、OpenCurrentDatabase 打开前端、按名称执行内置宏或函数、然后 Quit 收工。我们的日报自动化正是这个形态:一台不关机的办公室电脑深夜跑任务,早晨报纸已在共享目录躺着。配 Runtime 版本的 Access(免费分发、只能运行不能改设计),客户机甚至不需要购买完整 Office 专业版。
位宽要一致。 32 位进程加载不了 64 位组件,反之亦然。Office 按机器位数安装时通常无事,一旦有人换装了位数不同的 Office,原来好好的连接立刻断掉。接单交付文档里务必写明项目验证过的位数组合。
权限是共享目录的,不是数据库的。 外部直连绕过了你设计的登录窗体,能读到链接表指向的后端数据。安全性取决于共享目录的访问控制名单——这呼应了第 7 章的观点:文件级安全才是第一道闸。
别把自动化当成架构。 提线木偶式的调用适合夜间跑批这类"边缘活儿",不适合让核心业务逻辑依赖深夜脚本的成功率。想让能力长期稳定供给,要么内嵌进 Access 自己的定时任务,要么交给真正为调度而生的平台——这也自然引出了下一节的替代方案话题。
问:BI 工具直连后端,会不会拖垮我们的录入? 直连读取走的是同一套文件锁,重型查询密集刷新时确实会跟录入抢锁。稳妥姿势是让它读每日凌晨刷新的快照副本,代价是数据延迟一天——对分析场景几乎总是可接受的折中。
问:这些通道会被未来的系统升级弄断吗? 接口层是最容易被忽视的脆弱面。每当客户计划升级 Office 版本或更换位数,第一件事就是把连接串、自动化脚本、控件清单过一遍兼容性核对——这一条应当写进你的交付合同里,别等坏了再免费救火。
一句话为本节收束定位:扩展与被集成是同一枚硬币的两面,钥匙都是 COM 这套老而弥坚的契约。把内外两条通道都勘明白之后,你的系统第一次拥有了"生态位"——这不是比喻,而是下一节讨论去留时最实在的筹码。
看清了进出的路,下一个问题水到渠成:既然外面世界这么大,这套系统终局是什么?下一节我们把替代路线摆上桌面。