☰
在Word和WPS中用VBA调用豆包API:实现文档内AI翻译、润色与续写
2026/9/26 19:10:32 网站建设 项目流程

相信很多人跟我一样,平时写方案要找资料,整理翻译要看网页版,写总结更是费脑子。我试过把文档内容复制到网页上的AI对话框里,让豆包帮忙写,生成完再粘回来。结果是什么呢?表格没了,标题层级乱了,字体和行距全变回默认值,来回切换窗口还容易把文档搞崩。真正急需AI辅助的场景,往往是文档已经到了最后润色阶段,这时候任何一次"复制-粘贴-排版复修",都是在浪费时间。

所以我干脆写了个VBA宏,把豆包API直接接进Word和WPS里,选中文本按个快捷键,翻译、润色、续写直接生成在文档内部,连格式都能顺手带上。这篇文章把整个折腾过程完整记录下来,包括怎么申请API、怎么调HTTP请求、JSON解析怎么做、以及WPS和微软Office在这条路上有哪些大坑。你如果只是个VBA小白也没关系,代码全贴出来了,照着抄、改个密钥就能用。

1. 在文档软件里用AI,为什么绕不开VBA这条路

1.1 浏览器插件和Python脚本都差点意思

接到豆包API这件事,听起来最简单的方案是去装一个浏览器AI插件,或者写个Python脚本来调用。但真放到Word/WPS的使用场景里,这两条路都不太好走。

浏览器插件只能操作网页里的内容,它够不到Word文档里的选区、段落和样式。就算你强行把内容复制到网页上,AI处理完再复制回来,格式依然要全部重建。Python脚本的主题是"跑一遍"而不是"随时待命",每次要写双级标题、改五段话,都得重新运行脚本、层层复制粘贴,敏捷度完全不够。

VBA宏不一样,它本身就运行在文档进程内部。选中一段文字,调用Selection.text拿到内容,发给API,拿回结果后用Selection.InsertAfter直接写入,连加粗、字体颜色都可以顺带设置。这才是"文档内AI助手"该有的交互形态——不需要离开文档一步。

1.2 VBA方案的边界和适用条件

当然,VBA不是万能的。它的运行效率中等偏下,对对象的依赖重,也没有类似Python生态里那种便捷的requests库。但它有一个不可替代的优势:零运行时依赖。Word和WPS都内置VBA引擎,不需要额外装Python、Node或.NET环境。

这篇文章的方法适合满足三个条件的读者:其一,你主要在Word或WPS里处理中长文内容,比如报告、论文、合同、投标书;其二,你希望AI能原地生成、原地插入,而不是频繁切换窗口;其三,你能接受"写代码是不是有点工程感"的心理门槛。

如果你满足这三点,麻烦往下看。这套流程走通之后,你会发现自己写文档的方式真的会变。

2. 接豆包API前,先把这三样东西备齐

2.1 豆包API密钥的申请路径

豆包的大模型能力现在通过火山引擎的方舟平台对外开放,申请API Key的路径大概是:注册火山引擎账号 → 进入方舟控制台 → 开通相关服务 → 创建API Key。

需要注意,豆包API的请求地址是固定的:

https://ark.cn-beijing.volces.com/api/v3/chat/completions

认证方式是通过请求头携带Bearer Token,也就是你的API Key。在控制台创建完成后,会得到一个形如UUID的密钥串,这个需要妥善保存。密钥一旦泄露,别人就能用你的额度调用API。

模型名称方面,常见的有doubao-pro-32k、doubao-lite-32k等。首测建议选通用性较强的模型,参数规模大一些,回答质量一般更有保障。不同模型的计费、速度和上下文窗口不同,具体以方舟控制台展示的最新列表为准。

费用这里说个大概,豆包系列的定价按token计费,日常翻译、改写、做摘要,消耗量不算大,一个月通常就是几块钱到十几块钱的事。如果你只是自用,完全可以在预算可控范围内长期使用。

2.2 把Word/WPS的宏功能打开

Word中启用宏的路径是:文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置,然后勾选"启用所有宏"。这里要提醒一句,Office默认会把VBA视为安全风险,只启用你信任的文档。自己写的宏或者从可靠渠道复制的代码,才打开这个设置比较稳妥。

WPS的情况要分版本看。WPS专业版内置VBA支持,个人版默认不带VBA模块,需要通过安装VBA for WPS插件来获得。在个人版上如果按Alt+F11没反应,说明VBA环境还没装,去WPS官方社区或可信的软件站点找适配自己版本的VBA插件装上就好。

开启宏之后,打开的文档如果带有宏,可能会被系统阻止保存或者提示风险。解决办法是把文档另存为带宏的格式,Word和WPS通用的是.docm后缀,这个格式允许内嵌VBA代码。

2.3 VBA编辑器环境的第一印象

按Alt+F11就能进入VBA编辑器。如果你从来没接触过,别慌,我们只需要三块区域:左侧的项目树、中间的代码窗口、下方的立即窗口。

右键点击当前项目,选择"插入 → 模块",就会新建一个模块文件,我们在里面粘贴全部代码。之后按F5运行测试,或者按F8逐行执行来调试。

VBA编辑器的智能提示远不如现代IDE,但足以胜任我们这种小脚本。写完代码后,第1点另存为.docm格式非常重要,否则你的代码会在关闭文档后消失。但VBA不会自动报错告诉你有这件事,我自己丢过两次代码才长记性。

3. 核心代码拆解:从HTTP请求到JSON解析

3.1 调用豆包API的完整流程

抛开各种花哨功能,VBA调豆包的核心链路只有四步:

  1. 读取用户选中的文本,作为prompt
  2. 构造一个JSON格式的请求体
  3. 用XMLHTTP对象POST到API地址
  4. 从返回的JSON字符串中提取content字段,插入文档

理解了这条链路,后面的代码看起来就顺了。很多新手卡在步骤3和4,因为VBA没有原生的JSON函数库,也没有curl,稍微绕一圈就容易晕。

3.2 HTTP请求部分:使用XMLHTTP对象

VBA里发HTTP请求,最常用的是MSXML2.XMLHTTP60对象。在Windows系统上,它由系统组件提供,Word和WPS都能直接调用。

核心代码如下:

Function CallDoubaoAPI(ByVal prompt As String) As String Dim http As Object Set http = CreateObject("MSXML2.XMLHTTP60") Dim apiUrl As String Dim apiKey As String Dim jsonBody As String apiUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions" apiKey = "你的API密钥" ' 替换成真实Key ' 构造请求体JSON,注意字符串内双引号需要写两遍 jsonBody = "{""model"":""doubao-pro-32k"",""messages"":[{""role"":""user"",""content"":""" & JsonEscape(prompt) & """}]}" http.Open "POST", apiUrl, False http.setRequestHeader "Content-Type", "application/json; charset=utf-8" http.setRequestHeader "Authorization", "Bearer " & apiKey http.send jsonBody If http.Status <> 200 Then CallDoubaoAPI = "请求失败,状态码:" & http.Status & "," & http.responseText Exit Function End If CallDoubaoAPI = ExtractContent(http.responseText) End Function

这个请求体里有个关键点:jsonBody中双引号全部写作两个连续双引号,因为VBA字符串本身用双引号分隔。这是VBA里最容易让新人栽跟头的语法细节。

3.3 JSON转义:防止内容把请求体搞坏

很多人的正文内容里混着半角引号、反斜杠、换行符。直接拼进jsonBody会导致解析失败。需要专门写一个转义函数:

Function JsonEscape(ByVal s As String) As String s = Replace(s, "\", "\\") s = Replace(s, """", "\""") s = Replace(s, vbCrLf, "\n") s = Replace(s, vbLf, "\n") s = Replace(s, vbTab, "\t") JsonEscape = s End Function

这段代码的顺序有讲究:先替换反斜杠,再替换引号,这样后续替换不会破坏已经转义过的部分。我最初写的顺序反了,结果text正文里的引号永远处理不对,接口一调就报400。

你只需要在发送前调用JsonEscape,请求体就安全了。中文文本不需要手动转码,XMLHTTP在Content-Type设为utf-8后会正确处理Unicode字符串。

3.4 JSON响应解析:正则提取content字段

API返回的JSON长这样:

{ "choices": [ { "message": { "role": "assistant", "content": "这是豆包生成的正文" } } ] }

VBA没有原生JSON解析器,最轻量可靠的做法是用正则表达式匹配content字段:

Function ExtractContent(ByVal jsonText As String) As String Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = """content"":\s*""((?:\\.|[^""\\])*)""" reg.Global = False reg.IgnoreCase = True Dim matches As Object Set matches = reg.Execute(jsonText) If matches.Count = 0 Then ExtractContent = "解析失败,请检查API返回内容:" & Left(jsonText, 200) Exit Function End If Dim raw As String raw = matches(0).SubMatches(0) ' 还原JSON转义符 raw = Replace(raw, "\\", Chr(1)) raw = Replace(raw, "\n", vbLf) raw = Replace(raw, "\r", vbCr) raw = Replace(raw, "\t", vbTab) raw = Replace(raw, "\""", """") raw = Replace(raw, Chr(1), "\") ExtractContent = raw End Function

这个正则匹配的是"content": "..."中引号内的文本。里面(?:...)是非捕获分组,\\.允许匹配经过JSON转义的内容,[^""\\]匹配普通字符。整个表达式的意思是:尽可能匹配content字段里所有的内容,包括中间可能出现的转义引号。

必须强调的是,这里的正则只能解决单行content。如果一次生成返回的内容中包含大量换行和特殊符号,最好用两次或多次匹配,或者干脆把返回body保存成文本文件再用外部工具解析。不过就我实测,日常使用很少碰到完全解析不了的情况。

3.5 完整的调用宏:读取选中文本并插入结果

现在把这几块拼起来。在Word或WPS里,按下Alt+F11,插入模块,粘贴以下代码:

' 主入口宏:Ctrl+Shift+D触发 Public Sub DoubaoProcess() On Error GoTo ErrorHandler Dim prompt As String prompt = GetSelectedText() If Len(Trim(prompt)) = 0 Then MsgBox "请先选中要处理的文本", vbExclamation, "提示" Exit Sub End If ' 状态栏提示 Application.StatusBar = "正在调用豆包API,请稍候..." ' 构造完整prompt,这里以翻译为例 Dim fullPrompt As String fullPrompt = "请将以下内容翻译成英文,只输出翻译结果,不要额外解释:" & vbCrLf & prompt Dim result As String result = CallDoubaoAPI(fullPrompt) ' 在选中内容之后插入结果 InsertResult result Application.StatusBar = "豆包API调用完成" Exit Sub ErrorHandler: MsgBox "发生错误:" & Err.Description, vbCritical, "错误" End Sub ' 读取当前选中文本 Function GetSelectedText() As String If Selection.Type <> wdSelectionIP Then GetSelectedText = Selection.Text Else GetSelectedText = "" End If End Function ' 在光标处插入结果 Sub InsertResult(ByVal textToInsert As String) Selection.Collapse wdCollapseEnd Selection.InsertParagraphAfter Selection.MoveEnd wdParagraph, -1 Selection.InsertAfter textToInsert End Sub

第一次运行会看到宏提示"兼容性警告",问你是不是信任这个来源。选择信任,并把文档保存为.docm格式,代码就不会丢了。

4. 把宏变成顺手工具:三个实战场景与交互优化

4.1 场景一:一键翻译,替换原内容还是追加都行

翻译是最适合VBA调用AI的场景,因为翻译必然要拿到原文,用完又放回文档。

我给翻译宏做了两个按钮设计:一个是"插入译文到原文后面",另一个是"直接替换选中内容"。第二类的代码就是在InsertResult里多加一行:

Sub ReplaceSelectionWithResult(ByVal oldText As String, ByVal newText As String) Selection.Text = Replace(Selection.Text, oldText, newText) End Sub

使用中我比较推荐插入模式,先留着原文,核对完再手动调整。AI翻译偶尔会漏句、误解上下文,全自动替换一旦出错,重改比手打还费时。

4.2 场景二:给长文写摘要,自动放到文首

处理几个万字的长文档时,把摘要宏前缀到文档开头太有用了。你不需要通读全文,直接选中最前面的几段,让豆包提取要点。完整Prompt可以这样设计:

请阅读以下正文,提炼出300字以内的中文摘要,要求分3个要点列出来: [正文内容]

VBA里把选中的段落拼起来传入即可。摘要返回后,我通常让它插入到文章开头一个单独的段落里,用"【摘要】"开头标记,等通读确认后再删掉标记。

这里有一个小窍门:长文本超出模型上下文窗口时,用VBA的Split函数按3000字符切分,分段传给API,再拼接摘要结果。我自己写文档一般控制在10万字以内,所以很少触发窗口上限。但如果你的文本特别长,这个分段方案值得提前做好。

4.3 场景三:润色改写和续写,Prompt大有讲究

润色和续写,很多人上来就写"帮我润色这段话",效果往往一般。经过实验,比较好的Prompt模板是:

  • 改写:请改写以下内容,使语言更正式,保留原有数据、术语和格式不变:
  • 续写:请接着以下内容连续撰写3段,保持原有语气和风格:
  • 扩写:请把以下要点扩写成800字左右的段落,逻辑连贯:

VBA里我通常把这些模板做成几个不同的宏函数,共用同一个API请求核心。你甚至可以做成一个CommandBar菜单,右键点一下就弹出选项。

4.4 状态提示和错误处理的细节

直接调用API时,界面容易卡住,因为XMLHTTP的同步请求会阻塞VBA主线程。最简单的办法是用Application.StatusBar显示进度,让用户知道系统在干活。

等待时间在普通网络下大约2~5秒,超过10秒可以考虑调整token上限或换个模型。同步请求期间界面动不了,这是VBA的局限性。如果你要做异步,需要用WinHttpRequest的异步模式配合回调,但复杂度会明显上升。我建议日常场景同步就够了,不行就缩短上传文本的长度。

错误处理代码里的On Error GoTo是必须保留的。没有它,网络超时或API限流时,Excel/Word会弹出一大堆看不懂的英文错误,还会把状态栏卡住。

5. WPS和微软Word的环境差异与踩坑记录

5.1 第一坑:WPS个人版没有VBA

前面提过,WPS个人版默认不带VBA支持。我最初就是在WPS里按下Alt+F11没反应,去查才知道要装插件。

安装VBA for WPS插件要注意两点:版本必须匹配WPS内部版本(常见的有2019/2020/2021等),32位和64位也不能搞混。只装了插件还不够,WPS默认的宏安全设置也偏严格,需要在"开发工具 → 宏安全性"里调整。

更省心的是直接用WPS专业版,或者干脆在微软Word里跑这套代码。代码本身不需要改太多,WPS对VBA内置对象的兼容性还是比较好的。

5.2 第二坑:docm格式和信任中心的双重关卡

Word和WPS都把带宏的文档视为风险。你在自己的文档里写宏都会遇到"安全警告",提示宏已被禁用。解决办法是点开警告条上的"启用内容"按钮,或者把文档目录加入受信任位置。

保存格式这块,很多人折在"另存为"这一步。存成普通的.docx,宏会直接被丢掉,下次打开宏命令全部消失。必须要选择"启用宏的Word文档"格式,后缀名是.docm。

给个最省事的工作流:写代码之前先另存为.docm,之后所有的编辑都在这个文件里进行。写宏的时候顺手保存也不会丢代码。

5.3 第三坑:API响应太长时VBA解析字符串会溢出

我遇到过一个奇葩问题:让API生成大约2万字的分析报告,返回的JSON字符串长度超过了VBA字符串变量的某些边界限制。正则提取出来的content只有前半段,后半段没了。

排查了很久发现,根本不是API没生成完整,而是XMLHTTP.responseText在VBA里一次性读入时被截断了。解决办法有两个:

  1. 在请求体里加上"max_tokens": 4096,限制单次返回长度
  2. 长文章分段调用API,让每段输出控制在数千token以内

我后来就把prompt做了分段设计,没再出现过这种问题。这点很值得提前预防,不要卡在你已经写了循环调用的阶段才发现。

5.4 Word关闭慢与宏残留,为什么有人说"装上宏就变卡"

热词里有"word关闭慢解决方法"和"word关闭时卡顿",这个我很想拆开说。很多用户装了带宏的文档后,发现Word关闭特别慢,以为是宏搞的鬼。其实多半是宏代码里的对象没有释放,尤其是XMLHTTP和大量字符串对象。

解决的方法很简单,在宏程序退出前释放对象:

Sub Cleanup() Set http = Nothing Set reg = Nothing Set matches = Nothing End Sub

把这段放在每个宏的结尾,或者放在ErrorHandler的公共出口。实测下来,带宏文档的关闭时间可以从10秒级别压回到2秒左右。

另外,文档关闭慢也可能是剪贴板里有大量内容,或者正在加载网络字体。先排除这两类问题,再考虑是不是宏的锅。我建议带宏的文档用完宏以后,直接把代码清空重新保存成纯净版,不影响长期使用。

5.5 安全提醒:别把API Key硬编码进长期文档

最后这一点最要紧。很多人图省事,直接把API Key写在代码里,文档又随手分享给别人。密钥被同事朋友看到,轻则被拿来薅你的API额度,重则被人利用到不可控的地方。我现在的做法是:

  1. 代码里保存一个固定的占位符,每次运行由InputBox请求用户输入密钥
  2. 或者把密钥存到一个单独的配置文件(比如txt/reg),代码读取后立即从内存中销毁

第二个方案更实用。用VBA读取本地配置文件里的密钥,运行完后把变量置空。这个流程虽然多两步,但对长期使用体验是正向的。

写在最后的一点使用体会

走完这一路,我最深的感受是:在文档里内嵌AI,真正改变的是写作节奏。过去要停下来开网页、黏贴、等待、回贴、排版,写作状态断裂得很厉害。现在选中几段文字,快捷键一按,AI直接帮你续上,直觉上就像文档自带了一个助手。

如果你愿意再花半天时间,可以把自己常用的Prompt模板都整理成独立的宏命令,比如"正式化""口语化""缩写摘要""列出行动项"。每个宏都只是修改请求体里的system prompt一句话,复用性很强。我第一次写出来的时候,光是收集各种场景的prompt模板就花了不少功夫,但做完之后,日常效率的提升非常明显。

代码这东西,很多时候不复杂,复杂的是你想清楚自己实际怎么用。把场景定义清楚了,代码自然就顺了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询