设计一个能将所选文本发送到 DeepSeek API 并插入返回结果的 Word 宏,需要对每行代码进行深入剖析。下面这篇文章从宏的声明到错误处理,详尽解读代码的目的与实现细节,帮助你深入理解 VBA 在 Word 自动化中的应用。
DeepSeekV3 宏结构概览
本文分为以下几个部分介绍宏流程:
- 宏的声明与结束
- 变量声明与初始化
- API 密钥与文本选择检查
- 保存原始选区
- 文本预处理
- 调用自定义 API 函数
- 正则表达式提取内容
- 插入结果与光标恢复
- 错误处理与用户提示
宏的声明与结束
在 VBA 中,使用 Sub...End Sub 来定义一个不返回值的过程,这种过程执行一系列操作但不会作为表达式的一部分返回值 citeturn0search0。
vb
Sub DeepSeekV3()
' 宏主体
End Sub
上面代码标志着 DeepSeekV3 过程的开始与结束。
变量声明与初始化
使用 Dim 关键字声明局部变量,每个变量后需指定数据类型,以便 VBA 在编译时进行类型检查 citeturn0search10。
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 为空,则弹出消息框提醒用户输入密钥,并退出子过程 citeturn2search0。
vb
If api_key = "" Then
MsgBox "Please enter the API key."
Exit Sub
否则,需要检查当前 Selection 对象的类型,确保用户已选中文本;若未选中文本(类型非 wdSelectionNormal),则提示并退出 citeturn3search1turn3search0。
vb
ElseIf Selection.Type <> wdSelectionNormal Then
MsgBox "请选择文本."
Exit Sub
End If
保存原始选区
在修改 Selection 之前,先将当前选区的 Range 对象复制一份,以便后续恢复光标位置 citeturn9search0。
vb
Set originalSelection = Selection.Range.Duplicate
Duplicate 属性返回一个只读的 Range 对象副本,原选区保持不变。
文本预处理
从 Selection.Text 中提取用户选中的内容,并对特殊字符进行转义、去除换行符等多重 Replace 操作 citeturn1search0:
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
字段的值 citeturn5search0:
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 个字符进行判断 citeturn4search0。Execute 方法返回 MatchCollection 集合。
若匹配数大于 0,则取第一个 SubMatch 作为实际内容,并对转义字符进行反向处理,去除多余的符号 citeturn6search0:
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 文本,最后恢复原始选区 citeturn7search0:
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 键,插入空段落 citeturn8search0。
错误处理与用户提示
若 response 以 Error 开头,或 regex 不匹配,则分别通过 MsgBox 显示错误信息,并使用不同图标类型提醒用户 citeturn2search3:
vb
Else
MsgBox response, vbCritical
End If
vbCritical 常用于严重错误对话框。
以上分步骤详细解读了 DeepSeekV3 宏从声明、变量、条件检查、文本处理、正则提取到结果插入的完整逻辑,实现了 Word 文档中对外部智能服务的无缝对接。