提问人:Elayoub 提问时间:9/21/2023 最后编辑:JohnMElayoub 更新时间:9/21/2023 访问量:41
OpenAI API VBA 函数返回 #Value!但 MsgBox 显示响应
OpenAI API VBA function returns #Value! but MsgBox displays response
问:
我正在尝试将 OpenAI API 集成到 Excel 中。对 OpenAI 聊天完成的 http 请求工作正常,响应正常。当我用 MsgBox 显示它时,它看起来不错。
但是当在工作表中调用该函数时,返回值为 #VALUE!
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
答:
2赞
JohnM
9/21/2023
#1
在自定义工作表函数中可以执行的操作受到限制。虽然我在 MS Docs 中找不到进行 Web 或 API 调用的明确参考,但我对工作表函数的体验使我对这不起作用并不感到惊讶。
另一种方法是将 Button 或 Shape 添加到工作表中,然后将该按钮与Sub
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
它使用您现有的函数来获取单元格 A1 中文本的响应,并将其加载到单元格 A2 中(在本例中均在“Sheet1”中......显然,您可以根据需要更改单元格和工作表)。GPT
评论