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

相关推荐
G探险者2 小时前
为什么 Zookeeper 越扩越慢,而 Nacos 却越扩越快?
分布式·后端
不太厉害的程序员3 小时前
NC65配置xml找不到Bean
xml·java·后端·eclipse
不被定义的程序猿3 小时前
Golang 在 Linux 平台上的并发控制
开发语言·后端·golang
AntBlack3 小时前
Python : AI 太牛了 ,撸了两个 Markdown 阅读器 ,谈谈使用感受
前端·人工智能·后端
mikes zhang4 小时前
Flask文件上传与异常处理完全指南
后端·python·flask
Pitayafruit4 小时前
跟着大厂学架构01:如何利用开源方案,复刻B站那套“永不崩溃”的评论系统?
spring boot·分布式·后端
方圆想当图灵4 小时前
深入理解软件设计:领域驱动设计 DDD
后端·架构
excel4 小时前
MySQL 9 在 Windows 上使用 mysqld --initialize-insecure 无响应的排查与解决方案
后端
你怎么知道我是队长4 小时前
GO语言---defer关键字
开发语言·后端·golang
方圆想当图灵5 小时前
深入理解软件设计:什么是好的架构?
后端·架构·代码规范