拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在Word和WPS中用VBA调用豆包API:实现文档内AI翻译、润色与续写

在Word和WPS中用VBA调用豆包API:实现文档内AI翻译、润色与续写 相信很多人跟我一样平时写方案要找资料整理翻译要看网页版写总结更是费脑子。我试过把文档内容复制到网页上的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插件来获得。在个人版上如果按AltF11没反应说明VBA环境还没装去WPS官方社区或可信的软件站点找适配自己版本的VBA插件装上就好。开启宏之后打开的文档如果带有宏可能会被系统阻止保存或者提示风险。解决办法是把文档另存为带宏的格式Word和WPS通用的是.docm后缀这个格式允许内嵌VBA代码。2.3 VBA编辑器环境的第一印象按AltF11就能进入VBA编辑器。如果你从来没接触过别慌我们只需要三块区域左侧的项目树、中间的代码窗口、下方的立即窗口。右键点击当前项目选择插入 → 模块就会新建一个模块文件我们在里面粘贴全部代码。之后按F5运行测试或者按F8逐行执行来调试。VBA编辑器的智能提示远不如现代IDE但足以胜任我们这种小脚本。写完代码后第1点另存为.docm格式非常重要否则你的代码会在关闭文档后消失。但VBA不会自动报错告诉你有这件事我自己丢过两次代码才长记性。3. 核心代码拆解从HTTP请求到JSON解析3.1 调用豆包API的完整流程抛开各种花哨功能VBA调豆包的核心链路只有四步读取用户选中的文本作为prompt构造一个JSON格式的请求体用XMLHTTP对象POST到API地址从返回的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; charsetutf-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里按下AltF11插入模块粘贴以下代码 主入口宏CtrlShiftD触发 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里按下AltF11没反应去查才知道要装插件。安装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里一次性读入时被截断了。解决办法有两个在请求体里加上max_tokens: 4096限制单次返回长度长文章分段调用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额度重则被人利用到不可控的地方。我现在的做法是代码里保存一个固定的占位符每次运行由InputBox请求用户输入密钥或者把密钥存到一个单独的配置文件比如txt/reg代码读取后立即从内存中销毁第二个方案更实用。用VBA读取本地配置文件里的密钥运行完后把变量置空。这个流程虽然多两步但对长期使用体验是正向的。写在最后的一点使用体会走完这一路我最深的感受是在文档里内嵌AI真正改变的是写作节奏。过去要停下来开网页、黏贴、等待、回贴、排版写作状态断裂得很厉害。现在选中几段文字快捷键一按AI直接帮你续上直觉上就像文档自带了一个助手。如果你愿意再花半天时间可以把自己常用的Prompt模板都整理成独立的宏命令比如正式化口语化缩写摘要列出行动项。每个宏都只是修改请求体里的system prompt一句话复用性很强。我第一次写出来的时候光是收集各种场景的prompt模板就花了不少功夫但做完之后日常效率的提升非常明显。代码这东西很多时候不复杂复杂的是你想清楚自己实际怎么用。把场景定义清楚了代码自然就顺了。
返回列表