dsh-vba-bridge:在 DSH 会话里读写 Excel VBA 工程

前言

在 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 无法启动等问题并给出修复建议。

前置条件

  1. Windows + 桌面版 Microsoft Excel(README 记载本机实测 16.0.20430.20182)。
  2. 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye