目录
这段VBA代码在逻辑上是可行的,但需要根据实际使用场景进行调整和优化。以下是对代码可用性的分析及改进建议:
一、基础代码可用性分析
核心功能实现
- 能完成API调用基础流程:获取输入→发送请求→解析响应→输出结果
- 正确使用MSXML2库处理HTTP请求
- 基本错误处理机制(状态码判断)
需改进的关键点
' 原始代码片段 requestBody = "{ ""model"":""deepseek-chat"",""messages"":[{ ""role"":""user"",""content"":" & question & " }]}"
- JSON构造问题:未处理特殊字符(如双引号、换行符)
- 编码问题:未显式指定UTF-8编码
- 响应解析:字符串截取方式不够健壮(建议使用JSON解析器)
二、优化后的完整代码
Sub CallDeepSeekAPI()
Dim http As Object, json As Object
Dim url As String, apiKey As String
Dim requestBody As String, responseText As String
Dim parsedContent As String
' 初始化
Set http = CreateObject("MSXML2.XMLHTTP")
Set json = CreateObject("ScriptControl")
json.Language = "JScript"
' 配置参数
url = "https://api.deepseek.com/v1/chat/completions"
apiKey = "your-api-key-here" ' 替换真实API密钥
question = Chr(34) & Replace(ThisWorkbook.Sheets(1).Range("A1").Value, Chr(34), "\""") & Chr(34)
' 构建规范化的JSON请求体
requestBody = "{"
requestBody = requestBody & """model"":""deepseek-chat"","
requestBody = requestBody & """messages"":[{"
requestBody = requestBody & """role"":""user"","
requestBody = requestBody & """content"":" & question
requestBody = requestBody & "}]}"
' 发送请求
With http
.Open "POST", url, False
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
.setRequestHeader "Authorization", "Bearer " & apiKey
.send requestBody
End With
' 处理响应
If http.Status = 200 Then
responseText = http.responseText
On Error Resume Next ' 简单的错误处理
json.ExecuteStatement "var obj = (" & responseText & ")"
parsedContent = json.Eval("obj.choices[0].message.content")
On Error GoTo 0
If parsedContent <> "" Then
ThisWorkbook.Sheets(1).Range("A2").Value = parsedContent
Else
ThisWorkbook.Sheets(1).Range("A2").Value = "解析失败,原始响应:" & responseText
End If
Else
ThisWorkbook.Sheets(1).Range("A2").Value = _
"HTTP " & http.Status & " - " & http.statusText & vbCrLf & _
"响应内容:" & http.responseText
End If
' 清理对象
Set json = Nothing
Set http = Nothing
End Sub
三、改进亮点
健壮的JSON处理
- 使用ScriptControl引擎解析JSON响应
自动处理特殊字符转义
question = Chr(34) & Replace(..., Chr(34), "\""") & Chr(34)
增强的错误处理
- 明确区分网络错误和解析错误
- 保留原始响应数据用于调试
编码规范优化
显式指定UTF-8字符集
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
四、使用注意事项
环境配置
- 启用宏:文件 → 选项 → 信任中心 → 宏设置 → 启用所有宏
- 引用库:开发工具 → Visual Basic → 工具 → 引用 → 勾选「Microsoft Script Control 1.0」
API安全
' 建议将密钥存储在单独的工作表中 apiKey = ThisWorkbook.Sheets("Config").Range("B2").Value
性能优化
添加等待动画:
Application.StatusBar = "正在与DeepSeek通信..." DoEvents
错误重试机制:
For retry = 1 To 3 On Error Resume Next ' ...发送请求... If Err.Number = 0 Then Exit For Application.Wait (Now + TimeValue("0:00:02")) Next
五、典型应用场景示例
1. 自动生成数据透视表
Sub CreatePivotTable()
Dim response As String
Range("A1").Value = "创建数据透视表:行字段'产品名称',列字段'地区',值字段'销售额'"
CallDeepSeekAPI ' 调用API
' 解析返回的VBA代码并执行
On Error Resume Next
ExecuteExcel4Macro Range("A2").Value
If Err.Number <> 0 Then
MsgBox "自动创建失败,请手动检查指令"
End If
End Sub
2. 智能数据清洗
Sub DataCleaning()
Dim originalData As Range
Set originalData = Range("A1").CurrentRegion
' 发送清洗请求
Range("A1").Value = "处理重复值:列'订单号',保留首次出现"
CallDeepSeekAPI
' 执行返回的清洗方案
If InStr(Range("A2").Value, "RemoveDuplicates") > 0 Then
originalData.RemoveDuplicates Columns:=Array(1), Header:=xlYes
End If
End Sub
六、常见问题解决方案
问题1:出现「自动化错误」
解决方案:
- 检查ScriptControl引用是否启用
- 注册组件:以管理员运行
regsvr32 msscript.ocx
- 更换JSON解析库(如VBA-JSON)
问题2:中文乱码
解决方案:
' 在发送请求后添加编码转换 responseText = StrConv(.responseBody, vbUnicode)
问题3:响应超时
解决方案:
' 设置超时时间(单位:毫秒) http.setTimeouts 3000, 6000, 10000, 10000
建议在实际使用中:
- 将API密钥与业务逻辑分离存储
- 添加用户输入验证
- 实现请求缓存机制(对相同问题避免重复请求)
- 使用类模块封装API调用逻辑
通过以上优化,该方案可在实际办公场景中稳定运行,建议先在小范围测试后再进行核心业务集成。
最新回复