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

news2024/9/22 11:34:39

题意:“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 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` 关联,例如:”

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' 中……显然,你可以根据需要更改单元格和工作表)。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esp32c3 luaos

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、介绍二、相关介绍2.1helloworld——2.2任务框架2.3消息传递 与消息订阅2.4uart2.5二进制数据/c结构体的打包与解析2.6 zbuffer库2.8 uart 485 数据解析2.9 …

Ubuntu 20.04安装中文输入法

本文旨在详细介绍在Ubuntu 20.04操作系统中安装中文输入法的步骤和方法。我们将从选择适合的中文输入法软件、下载与安装过程、配置输入法设置以及解决可能遇到的问题等方面展开讲解,帮助用户轻松实现在Ubuntu 20.04系统下流畅输入中文的需求。无论你是Ubuntu的新手…

东方银行--用 MinIO 和 Dremio 替代 Hadoop

我们的客户是一家总部位于日本的全球金融机构,最近与MinIO和Dremio一起完成了一个雄心勃勃的Hadoop替换项目。你可以在Subsurface的这个演讲中看到他们介绍它,但我们认为我们也会把它写下来。与大多数银行一样,该公司已经建立了大量的Hadoop足…

游戏开发设计模式之状态模式

目录 状态模式在Unity中的具体实现案例是什么? 如何在游戏开发中有效地结合状态模式与享元模式以优化资源使用? 状态模式与其他设计模式(如观察者模式、策略模式)结合使用的实际例子有哪些? 在处理复杂状态变化时&…

day19:生成器、yield表达式、三元表达式、生成式和函数的递归

一、生成器 1. 如何得到自定义的迭代器 【方法一】:在函数内一旦存在yield关键字,调用函数并不会执行函数体代码,会返回一个生成器对象,生成器即自定义的迭代器。 【方法二】:生成器表达式 反问:为什么自…

信息系统安全等级划分及其重要性:构建安全基石

在信息化社会,数据已成为企业与国家的重要资产,其安全防护日益受到重视。我国的“信息系统安全等级保护制度”正是在这一背景下应运而生,旨在通过等级划分,为不同级别的信息系统提供适配的安全保护措施,确保信息资产的…

Camera篇(一)ov13850调试

ov13850一千三百万像素&#xff0c;必须离线模式&#xff0c;所以ISP TDM配置离线 menuconfig 中需要将ISP TDM功能打开&#xff0c;同时开启WDR 配为&#xff08;*&#xff09; dts配置 work_mode 一律配1 &vind0 {csi_top <360000000>;csi_isp <322000000…

基于x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的眼睛…

【C++ Primer Plus习题】3.4

问题: 解答: #include <iostream> using namespace std;const int DAY_TO_HOUR 24; const int HOUR_TO_MIN 60; const int MIN_TO_SEC 60;int main() {long seconds 0,record0;int days 0, hours 0, minutes0;cout << "请输入秒数:";cin >>…

进阶-5.锁

锁 1.概述2.全局锁3.表级锁3.1 介绍3.2 表锁3.3 元数据锁3.4意向锁 4.行级锁 1.概述 分类 按锁的粒度分类&#xff1a; 全局锁&#xff1a;锁住数据库中所有表表级锁&#xff1a;每次操作锁定整张表行级锁&#xff1a;每次操作锁定对应的行数据 2.全局锁 介绍 全局锁就是对…

【经验】linux下cuda的更换

linux下cuda的更换 查看当前cuda和cudnn的版本 nvcc -Vcudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2下载对应版本的cuda 查看驱动版本535.54.03 下载对应的cuda版本 版本查看https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.htm…

Revisiting PM-Based B+-Tree With Persistent CPU Cache——论文泛读

TPDS 2024 Paper 论文阅读笔记整理 问题 持久存储器&#xff08;PM&#xff09;具有接近DRAM的性能和数据持久性&#xff0c;配备PM的平台支持异步DRAM刷新&#xff08;ADR&#xff09;功能[2]&#xff0c;确保PM DIMM的内容以及已到达内存控制器的写挂起队列&#xff08;WPQ…

深度学习 --- VGG16卷积核的可视化(JupyterNotebook实战)

VGG16卷积核的可视化 在前一篇文章中&#xff0c;我对VGG16输入了一张图像&#xff0c;并实现了VGG16各层feature map的可视化。深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读615次&#xff0c;点赞13次&#xff0c;收藏15次。在VGG16模…

123-域防火墙入站出站规则不出网隧道上线组策略对象同步

参考&#xff1a;【内网安全】 域防火墙&入站出站规则&不出网隧道上线&组策略对象同步_对公司的邮件服务器建立防火墙规则 入站出战-CSDN博客 单机-防火墙-限制端口出入站 熟悉常见主机配置不出网的方式 1、入站&出站&连接安全 2、域&专用&公网…

【采集软件】用Python开发的小红薯详情批量采集工具,含笔记正文、转评赞藏等

一、背景介绍 1.1 爬取目标 用python开发的爬虫采集软件&#xff0c;可自动按笔记链接抓取笔记的详情数据。 为什么有了源码还开发界面软件呢&#xff1f;方便不懂编程代码的小白用户使用&#xff0c;无需安装python&#xff0c;无需改代码&#xff0c;双击打开即用&#xff…

本地部署docker文档

由于访问 https://docs.docker.com/ 文档慢&#xff0c;直接本地部署官方文档 如果不想执行以下操作&#xff0c;也可以直接使用官方文档仓库地址提供的 Dockerfile 和 compose.yaml 进行操作 以下操作环境为Windows系统&#xff0c;根据 Dockerfile 相关操作来生成 html 页面…

二叉树【1】

操作 新建节点&#xff08;new&#xff09; 新建一个值为v的节点&#xff0c;左右孩子NULL 查找 void查找函数 { 递归边界&#xff1a;NULL&#xff0c;然后退出 &#xff08;return&#xff1b;&#xff09; 查找左子树 查找柚子树 } 插入 void 插入函数 {…

Vue表单元素绑定:v-model 指令

Vue 指令系列文章&#xff1a; 《Vue插值&#xff1a;双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令&#xff1a;v-cloak、v-once、v-pre 指令》 《Vue条件判断&#xff1a;v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历&#xff1a;v-for 指令》 《Vue事件…

NPM:配置阿里镜像库

1、配置阿里云镜像源 #查看当前使用的镜像地址命令 npm config get registry#设置阿里镜像源 npm config set registry http://registry.npmmirror.com 这里要注意下&#xff0c;之前的源镜像地址 https://registry.npm.taobao.org/ 已经不能用了&#xff0c;这里要更改为新地…

80页PPT数据中台应用技术实施方案

本文资料完整版81页PPT&#xff0c;下载完整PPT资料&#xff0c;知识星球APP搜索【智慧方案文库】&#xff0c;下载“数据中台”合集资料&#xff0c;以及8800份解决方案 数据中台设计的方法 (1)基于面向服务的架构方法&#xff08;SOA&#xff09; 基于面向服务的架构方法 …