目录

这段VBA代码在逻辑上是可行的,但需要根据实际使用场景进行调整和优化。以下是对代码可用性的分析及改进建议:

一、基础代码可用性分析

  1. 核心功能实现

    • 能完成API调用基础流程:获取输入→发送请求→解析响应→输出结果
    • 正确使用MSXML2库处理HTTP请求
    • 基本错误处理机制(状态码判断)
  2. 需改进的关键点

    ' 原始代码片段
    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

三、改进亮点

  1. 健壮的JSON处理

    • 使用ScriptControl引擎解析JSON响应
    • 自动处理特殊字符转义

      question = Chr(34) & Replace(..., Chr(34), "\""") & Chr(34)
  2. 增强的错误处理

    • 明确区分网络错误和解析错误
    • 保留原始响应数据用于调试
  3. 编码规范优化

    • 显式指定UTF-8字符集

      .setRequestHeader "Content-Type", "application/json; charset=UTF-8"

四、使用注意事项

  1. 环境配置

    • 启用宏:文件 → 选项 → 信任中心 → 宏设置 → 启用所有宏
    • 引用库:开发工具 → Visual Basic → 工具 → 引用 → 勾选「Microsoft Script Control 1.0」
  2. API安全

    ' 建议将密钥存储在单独的工作表中
    apiKey = ThisWorkbook.Sheets("Config").Range("B2").Value
  3. 性能优化

    • 添加等待动画:

      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:出现「自动化错误」

  • 解决方案:

    1. 检查ScriptControl引用是否启用
    2. 注册组件:以管理员运行regsvr32 msscript.ocx
    3. 更换JSON解析库(如VBA-JSON)

问题2:中文乱码

  • 解决方案:

    ' 在发送请求后添加编码转换
    responseText = StrConv(.responseBody, vbUnicode)

问题3:响应超时

  • 解决方案:

    ' 设置超时时间(单位:毫秒)
    http.setTimeouts 3000, 6000, 10000, 10000

建议在实际使用中:

  1. 将API密钥与业务逻辑分离存储
  2. 添加用户输入验证
  3. 实现请求缓存机制(对相同问题避免重复请求)
  4. 使用类模块封装API调用逻辑

通过以上优化,该方案可在实际办公场景中稳定运行,建议先在小范围测试后再进行核心业务集成。

最后编辑:2025年02月21日 ©著作权归作者所有

发表评论