前言¶
在 DSH(DeepSeek Harness)里让 AI 改 Excel 宏,常见做法是解压工作簿、硬改 vbaProject.bin 或把模块导出成文本再拼回去。这类路径容易和 Excel 自己的编译、保存语义脱节,改完能否被 Excel 接受往往要人工再开一遍 VBE 确认。
dsh-vba-bridge 走另一条路:通过本机桌面 Excel 的 COM 与 VBIDE 列模块、读源码、写代码、导出组件,并在保存后于同一 Excel 实例里重新打开做 SHA-256 校验。宏由 Excel 编译与落盘,而不是在包外拆二进制。下面介绍插件定位、工具能力、安装前置与典型用法。
这是什么¶
dsh-vba-bridge 是 DSH Host 插件(维护者 alexltr),在 Windows + 桌面版 Microsoft Excel 环境下,把 VBA 工程的读写能力暴露为 Harness 可调用的工具。目标文件为 .xlsm、.xlsb、.xls、.xlam;纯 .xlsx 无 VBA 容器,会被拒绝。
插件当前版本为 0.1.1,许可证 MIT。package.json 要求 Node ^22.19 || >=24、DSH >=0.2.0-0 <0.3.0,且仅支持 win32。
核心功能¶
安装后注册六个工具,相对路径按 DSH 会话工作目录 解析,绝对路径原样使用。
| 工具 | 作用 |
|---|---|
vba_doctor |
安装后建议先跑:检查 Python、pywin32、Excel COM、AccessVBOM、离线解析器、临时目录,可选指定一个工作簿 |
vba_inspect |
工程名、保护状态、全部组件(模块/工作表/ThisWorkbook/窗体)与引用 |
vba_read_module |
读取单个模块源码,含 UserForm 代码区 |
vba_write_module |
替换/追加/新建模块,原地保存,复开校验,生成 .bak |
vba_export_modules |
导出全部组件:源码(.bas/.cls/.frm)或原生 .frm + .frx,并写 _manifest.json |
vba_list_procedures |
列出 Sub/Function/Property 的参数、起止行号,含窗体事件处理 |
写入语义(vba_write_module)
mode=replace:重写模块代码区;隐藏的VB_*属性由 Excel 保留。mode=append:读出旧代码后拼接再整体重写。create=true:模块不存在时新建标准模块。- 每次写入会先复制
原名.YYYYmmdd-HHMMSS.bak.xlsm,保存后在同一 Excel 实例里重新打开并比对源码 SHA-256,返回verified: true/false。
窗体(UserForm)
窗体代码对应 CodeModule,事件过程与普通模块一样可读写;只改代码区,不改控件布局、属性页或 .frx 设计数据。导出时 mode=component 可得到带完整 OleObjectBlob 的 .frm + .frx;mode=code 的 .frm 仅含代码,不能直接重新导入。
导出
mode=code:UTF-8 源码,便于 grep、diff 或交给模型分析。mode=component:调用VBComponent.Export,窗体附带.frx。- 输出目录会写
_manifest.json(类型、行数、字节数、SHA-256、跳过/失败);overwrite默认false。
安全边界(README 明示)
桥接期间 AutomationSecurity=3,读写源码不会顺带执行工作簿里的宏;插件不提供「运行宏」工具。桥接以宿主用户权限运行 Python,会绕过 DSH 文件沙箱;密码保护的 VBA 工程无法编辑;保存由 Excel 重写整个包,字节会变化,生产环境请保留备份并做业务校验。
安装与启用¶
发布到 npm 后,安装命令为:
dsh plugin add dsh-vba-bridge
本地开发目录可做 bundle 链接安装(路径按你本机仓库位置替换):
plugin_manager action=install_bundle target=F:\MyProjects\dsh\vba_bridge
安装后先调用 vba_doctor,它会逐项列出缺 Python、缺 pywin32、未开 AccessVBOM、Excel 无法启动等问题并给出修复建议。
前置条件¶
- Windows + 桌面版 Microsoft Excel(README 记载本机实测 16.0.20430.20182)。
- Python 3.10+,并安装
pywin32:
pip install pywin32
默认使用 PATH 中的 python;可通过配置 pythonPath 或环境变量 DSH_VBA_PYTHON 指定。
3. Excel 信任中心开启 「信任对 VBA 工程对象模型的访问」,例如注册表:
HKCU\Software\Microsoft\Office\16.0\Excel\Security\AccessVBOM = 1
这是允许本机程序读写 VBA 的全局开关,属于安全决策,不要在不可信机器上随意打开。
4. 目标文件须为启用宏的格式;.xlsx 会返回 NOT_MACRO_ENABLED。
配置¶
安装行 id 为 vba-bridge,默认项见仓库 cordis.patch.yml:
| 键 | 默认 | 说明 |
|---|---|---|
pythonPath |
空 → python(其次 DSH_VBA_PYTHON) |
带 pywin32 的 Python |
bridgePath |
空 → 包内 bridge/vba_bridge.py |
自定义桥接脚本 |
timeoutMs |
240000 |
单次工具调用超时 |
allowWrite |
true |
false 时 vba_write_module 直接拒绝 |
maxOutputChars |
200000 |
工具输出截断上限 |
修改后重载插件(禁用/启用)或重启 Harness;也可在 profile 的 patch 层按行 id vba-bridge 覆盖。当前版本尚未导出 Config schema,上述键通过 patch 配置而非设置页表单。
典型用法¶
会话里用自然语言即可,例如:
- 「看一下
D:\book.xlsm里有哪些 VBA 模块」 - 「把
模块1的源码读出来」 - 「把这段代码写进
模块1,先备份」 - 「把
MyVBALibrary.xlam的全部模块导出到F:\dump」 - 「列出
FRM_PictureViewer里有哪些事件处理过程」
需要明确参数时,可参考 README 中的 JSON 示例:
{"file": "D:\\book.xlsm"}
{"file": "D:\\book.xlsm", "module": "模块1"}
{"file": "D:\\book.xlsm", "module": "模块1", "code": "Sub Hello()\r\n MsgBox \"hi\"\r\nEnd Sub\r\n", "mode": "replace"}
{"file": "D:\\book.xlsm", "outDir": "D:\\dump", "mode": "component", "overwrite": true}
{"file": "D:\\book.xlsm", "module": "FRM_PictureViewer"}
不经 Harness、直接调试桥接脚本时(在插件仓库目录下):
python bridge\vba_bridge.py inspect fixtures\sample.xlsm
python bridge\vba_bridge.py read fixtures\sample.xlsm 模块1
python bridge\vba_bridge.py export fixtures\sample.xlsm work\export --mode component
python bridge\vba_bridge.py procedures fixtures\sample.xlsm 模块1
适用场景与注意¶
适合谁
- 已在 Windows 上用 DSH 维护
.xlsm/.xlam等业务宏,希望 AI 能列工程、读改模块、批量导出并在 Excel 侧验收的场景。 - 需要把 VBA 源码导出为文本做 diff,或备份 UserForm 的
.frm/.frx组件的场景。
限制(README 列举)
- 写入/导出依赖桌面 Excel;无 Excel 时仅能离线只读,且离线模式组件类型为近似值。
- 窗体只支持代码区,不支持设计器编辑;当前不运行宏。
- 无
allowedRoots路径白名单;.xlsb/.xls未单独实测(.xlsm/.xlam已实测)。 - 单次调用通常约 5–15 秒,取决于 Excel 启动、杀毒软件与是否复开校验。
安装前建议
插件以当前 DSH 进程用户权限运行 Python 并访问任意你传入的工作簿路径。安装前应查看 GitHub 源码 与 MIT 许可证,只安装可信版本,只对可信工作簿使用;allowWrite=false 可在只读场景降低误写风险。
常见错误码包括:VBA_TRUST_DISABLED(未开 AccessVBOM)、PROJECT_PROTECTED(工程有密码)、FILE_LOCKED(工作簿被占用)、PYWIN32_MISSING 等,README 错误码表中有对应处理说明。
结尾¶
dsh-vba-bridge 把 Excel VBA 工程的操作收敛到 COM/VBIDE 与一组 Harness 工具:先 vba_doctor 自检,再 inspect、读改、导出与列过程,写入带备份与复开校验。若你正在 DSH 里处理桌面 Excel 宏,可从社区目录页了解条目信息,并在 GitHub 查看完整 README 与 docs/feasibility.md。