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

相关推荐
做运维的阿瑞19 分钟前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽1 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang2 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室4 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友4 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡4 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课5 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈5 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区5 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔5 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端