OpenAI API VBA function returns #Value! but MsgBox displays response

题意:"OpenAI API VBA 函数返回 #Value!,但 MsgBox 显示响应"

问题背景:

I am trying to integrate the OpenAI API into Excel. The http request to OpenAI chat completion works correctly and the response is OK. When I display it with a MsgBox, it looks fine.

"我正在尝试将 OpenAI API 集成到 Excel 中。对 OpenAI 聊天完成的 HTTP 请求正常工作,响应也正常。当我使用 MsgBox 显示它时,它看起来很好。"

But when the function is called in a sheet, the returned value is #VALUE!

"但当在工作表中调用该函数时,返回的值是 #VALUE!"

python 复制代码
Public Function GPT(InputPrompt) As String
  'Define variables
  Dim request As Object
  Dim text, response, API, api_key, DisplayText, GPTModel As String
  Dim GPTTemp As Double
  Dim startPos As Long
  Dim rng As Range
  Dim httpRequest As Object
  Dim countArray As Variant

 
  'API Info
  API = "https://api.openai.com/v1/chat/completions"
  api_key = Trim(Range("API_Key").value)
  'Note: for future upgrades, please replace with GPT-4 etc
  GPTModel = Range("Model_Number").value
  
  If api_key = "" Then 'API key is missing!
    MsgBox "Error: API cannot be blank! Please go to 'Configuration' tab and enter a valid OpenAI API key", vbExclamation, "GPT for Excel"
    frmStatus.Hide
    Exit Function
  End If
    
  'Clean input text and make JSON safe
  text = CleanInput(InputPrompt)
  
  'Create request object
  Set httpRequest = CreateObject("MSXML2.XMLHTTP")
  'Set httpRequest = New MSXML2.XMLHTTP60
  
  'Get temp from Config panel
  GPTTemp = Range("GPT_temperature").value
  
  'Assemble request body
  Dim requestBody As String
  requestBody = "{""model"": ""gpt-4"", ""messages"": [{""role"": ""user"", ""content"": """ & text & """}], ""temperature"": 0.7}"

  With httpRequest
     .Open "POST", API, False
     .setRequestHeader "Content-Type", "application/json"
     .setRequestHeader "Authorization", "Bearer " & api_key
     .send (requestBody)
  End With

  If httpRequest.Status = 200 Then 'Successfully called OpenAI API
   response = httpRequest.responseText
   'Get usage info from response object
   countArr = ExtractUsageInfo(response)
    
   startPos = InStr(response, """content"":") + Len("""content"":") + 2
   endPos = InStr(startPos, response, "},")
   DisplayText = Trim(Mid(response, startPos, endPos - startPos))
   DisplayText = Mid(DisplayText, 1, Len(DisplayText) - 2)
   DisplayText = CleanOutput(DisplayText)
    
   Set request = Nothing
   If FillActive = False Then frmStatus.Hide
   MsgBox (GPT)
   GPT = DisplayText
   MsgBox (GPT)
   If Range("Log_Data").value = "Yes" Then
    Call UpdateLogFile(countArr)
   End If
  Exit Function

End Function

问题解决:

You are limited as to what you can do in a custom worksheet function. While I can't find an explicit reference to making web or API calls in the MS Docs my experience of worksheet functions leads me to not be surprised that this doesn't work.

"在自定义工作表函数中,你的操作是有限的。虽然我在微软文档中找不到明确提到进行 Web 或 API 调用的内容,但根据我对工作表函数的经验,这种方法不起作用并不令人意外。"

An alternative would be to add a Button or Shape to your worksheet then associated that button with a Sub such as

"另一种方法是在你的工作表中添加一个按钮或形状,然后将该按钮与一个 `Sub` 关联,例如:"

python 复制代码
Sub ButtonClicked()
    Dim Response As String, InputPrompt As String
    InputPrompt = CStr(ThisWorkbook.Sheets("Sheet1").Range("A1").Value)
    Response = GPT(InputPrompt)
    ThisWorkbook.Sheets("Sheet1").Range("A2").Value = Response
End Sub

Which uses your existing GPT function to get a response for the text in cell A1 and loads it into cell A2 (both in 'Sheet1' in this case ... obviously you can change the cells and worksheet as needed).

"这个方法使用你现有的 `GPT` 函数来获取单元格 A1 中的文本的响应,并将其加载到单元格 A2 中(在本例中,这两个单元格都在 'Sheet1' 中......显然,你可以根据需要更改单元格和工作表)。"

相关推荐
视觉&物联智能5 小时前
【杂谈】-人工智能风险文化对组织决策的深远影响
人工智能·安全·ai·agi
白雪茫茫6 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
05候补工程师6 小时前
[实战复盘] 拒绝 AI 屎山!我从设计模式中学到的“调教”AI 新范式
人工智能·python·设计模式·ai·ai编程
进击的雷神8 小时前
别再对着祖传代码发愁了,再乱的项目 Zread 也能快速生成可读文档
ai·wiki·zread
木子七9 小时前
RAG质量评估&实施RAG工程核心步骤
ai·rag
核数聚11 小时前
给四足机器人装上 “智慧大脑”!核数聚具身数据集,让园区巡检又快又稳
人工智能·机器学习·ai·机器人
时光追逐者11 小时前
白嫖小米 MiMo 百万亿 Token,附 Claude Code 配置全流程!
ai·claude code·xiaomi
Non-existent98712 小时前
TableGIS的WPS扩展项插件-通信网优规划相关地理空间数据处理
数据分析·excel·wps
DanCheOo12 小时前
开源 | 我是怎么用 ai-memory 让 Cursor 每次开新对话都自动知道项目背景的
前端·人工智能·ai·ai编程
蜘蛛小助理12 小时前
跨境电商不用买 ERP!蜘蛛表格搭建订单管理 + 物流跟踪 + 财务对账一体化系统
大数据·人工智能·ai·多维表格·蜘蛛表格