编写一个 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 文档中对外部智能服务的无缝对接。

相关推荐
凌览7 分钟前
有了 25k Star 的MediaCrawler爬虫库加持,三分钟搞定某红书、某音等平台爬取!
前端·后端·python
这里有鱼汤18 分钟前
给你的DeepSeek装上实时行情,让他帮你炒股
后端·python·mcp
咖啡啡不加糖20 分钟前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南23 分钟前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
ん贤42 分钟前
RESTful风格
后端·go·restful
Humbunklung44 分钟前
Rust方法语法:赋予结构体行为的力量
开发语言·后端·rust
萧曵 丶1 小时前
Rust 内存结构:深入解析
开发语言·后端·rust
Kookoos1 小时前
ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
数据库·分布式·后端·abp vnext·azure cosmos