您的位置:首页 > 教育 > 培训 > OpenAI API VBA function returns #Value! but MsgBox displays response

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

2024/10/6 9:20:05 来源:https://blog.csdn.net/suiusoar/article/details/141451472  浏览:    关键词: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!”

Public Function GPT(InputPrompt) As String'Define variablesDim request As ObjectDim text, response, API, api_key, DisplayText, GPTModel As StringDim GPTTemp As DoubleDim startPos As LongDim rng As RangeDim httpRequest As ObjectDim countArray As Variant'API InfoAPI = "https://api.openai.com/v1/chat/completions"api_key = Trim(Range("API_Key").value)'Note: for future upgrades, please replace with GPT-4 etcGPTModel = Range("Model_Number").valueIf 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.HideExit FunctionEnd If'Clean input text and make JSON safetext = CleanInput(InputPrompt)'Create request objectSet httpRequest = CreateObject("MSXML2.XMLHTTP")'Set httpRequest = New MSXML2.XMLHTTP60'Get temp from Config panelGPTTemp = Range("GPT_temperature").value'Assemble request bodyDim requestBody As StringrequestBody = "{""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 WithIf httpRequest.Status = 200 Then 'Successfully called OpenAI APIresponse = httpRequest.responseText'Get usage info from response objectcountArr = ExtractUsageInfo(response)startPos = InStr(response, """content"":") + Len("""content"":") + 2endPos = InStr(startPos, response, "},")DisplayText = Trim(Mid(response, startPos, endPos - startPos))DisplayText = Mid(DisplayText, 1, Len(DisplayText) - 2)DisplayText = CleanOutput(DisplayText)Set request = NothingIf FillActive = False Then frmStatus.HideMsgBox (GPT)GPT = DisplayTextMsgBox (GPT)If Range("Log_Data").value = "Yes" ThenCall UpdateLogFile(countArr)End IfExit FunctionEnd 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` 关联,例如:”

Sub ButtonClicked()Dim Response As String, InputPrompt As StringInputPrompt = 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' 中……显然,你可以根据需要更改单元格和工作表)。”

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com