编写一个 Word Macro,调用 DeepSeek API

设计一个能将所选文本发送到 DeepSeek API 并插入返回结果的 Word 宏,需要对每行代码进行深入剖析。下面这篇文章从宏的声明到错误处理,详尽解读代码的目的与实现细节,帮助你深入理解 VBA 在 Word 自动化中的应用。

DeepSeekV3 宏结构概览

本文分为以下几个部分介绍宏流程:

  • 宏的声明与结束
  • 变量声明与初始化
  • API 密钥与文本选择检查
  • 保存原始选区
  • 文本预处理
  • 调用自定义 API 函数
  • 正则表达式提取内容
  • 插入结果与光标恢复
  • 错误处理与用户提示

宏的声明与结束

在 VBA 中,使用 Sub...End Sub 来定义一个不返回值的过程,这种过程执行一系列操作但不会作为表达式的一部分返回值 citeturn0search0。

vb 复制代码
Sub DeepSeekV3()
  ' 宏主体
End Sub

上面代码标志着 DeepSeekV3 过程的开始与结束。

变量声明与初始化

使用 Dim 关键字声明局部变量,每个变量后需指定数据类型,以便 VBA 在编译时进行类型检查 citeturn0search10。

vb 复制代码
    Dim api_key As String
    Dim inputText As String
    Dim response As String
    Dim regex As Object
    Dim matches As Object
    Dim originalSelection As Object

这里定义了存储 API 密钥、输入文本、响应文本、正则对象、匹配集合和原始选区的变量。

紧接着,将用户的 API 密钥赋值给 api_key 变量。

vb 复制代码
    api_key = "自己的AK"

API 密钥与文本选择检查

若 api_key 为空,则弹出消息框提醒用户输入密钥,并退出子过程 citeturn2search0。

vb 复制代码
    If api_key = "" Then
       MsgBox "Please enter the API key."
       Exit Sub

否则,需要检查当前 Selection 对象的类型,确保用户已选中文本;若未选中文本(类型非 wdSelectionNormal),则提示并退出 citeturn3search1turn3search0。

vb 复制代码
    ElseIf Selection.Type <> wdSelectionNormal Then
       MsgBox "请选择文本."
       Exit Sub
    End If

保存原始选区

在修改 Selection 之前,先将当前选区的 Range 对象复制一份,以便后续恢复光标位置 citeturn9search0。

vb 复制代码
   Set originalSelection = Selection.Range.Duplicate

Duplicate 属性返回一个只读的 Range 对象副本,原选区保持不变。

文本预处理

从 Selection.Text 中提取用户选中的内容,并对特殊字符进行转义、去除换行符等多重 Replace 操作 citeturn1search0:

vb 复制代码
   inputText = Replace(Replace(Replace(Replace(Replace(Selection.Text, "\", "\\"), vbCrLf, ""), vbCr, ""), vbLf, ""), Chr(34), "\""")

这里连续调用 Replace 函数,依次替换反斜杠、回车换行、单独回车、换行、双引号,确保传输到 API 的字符串符合 JSON 要求。

调用自定义 API 函数

使用自定义的 CallDeepSeekAPI 函数,将 api_key 与 inputText 传入并返回结果字符串:

vb 复制代码
   response = CallDeepSeekAPI(api_key, inputText)

CallDeepSeekAPI 是用户自行实现的函数,用于与 DeepSeek 服务通信并返回 JSON 格式的响应。

正则表达式提取内容

判断 response 是否以 Error 开头,若不是,则利用 VBScript.RegExp 对象从 JSON 中提取 content 字段的值 citeturn5search0:

vb 复制代码
   If Left(response, 5) <> "Error" Then
        Set regex = CreateObject("VBScript.RegExp")
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = """content"":""(.*?)"""
        End With
        Set matches = regex.Execute(response)

Left 函数截取字符串前 5 个字符进行判断 citeturn4search0。Execute 方法返回 MatchCollection 集合。

若匹配数大于 0,则取第一个 SubMatch 作为实际内容,并对转义字符进行反向处理,去除多余的符号 citeturn6search0:

vb 复制代码
        If matches.Count > 0 Then
            response = matches(0).SubMatches(0)
            response = Replace(Replace(response, """", Chr(34)), """", Chr(34))
            response = Replace(response, "\n", vbCrLf)
            response = Replace(response, "*", "")
            response = Replace(response, "#", "")

插入结果与光标恢复

将 Selection 向文档末尾折叠,再插入新段落并填入 response 文本,最后恢复原始选区 citeturn7search0:

vb 复制代码
            Selection.Collapse Direction:=wdCollapseEnd
            Selection.TypeParagraph
            Selection.TypeText Text:=response
            originalSelection.Select
        Else
            MsgBox "Failed to parse API response.", vbExclamation
        End If

TypeParagraph 相当于敲击 Enter 键,插入空段落 citeturn8search0。

错误处理与用户提示

若 response 以 Error 开头,或 regex 不匹配,则分别通过 MsgBox 显示错误信息,并使用不同图标类型提醒用户 citeturn2search3:

vb 复制代码
    Else
        MsgBox response, vbCritical
    End If

vbCritical 常用于严重错误对话框。


以上分步骤详细解读了 DeepSeekV3 宏从声明、变量、条件检查、文本处理、正则提取到结果插入的完整逻辑,实现了 Word 文档中对外部智能服务的无缝对接。

相关推荐
WeiXiao_Hyy11 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇17 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long31629 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人2 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法3 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化3 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
我爱加班、、3 小时前
Websocket能携带token过去后端吗
前端·后端·websocket