gpt4 book ai didi

macos - 从 VBA Excel for Mac 在 HTTP Post 中发送数据

转载 作者:行者123 更新时间:2023-12-04 21:07:34 26 4
gpt4 key购买 nike

所以我有一个任务要在 Excel for Mac 中使用 VBA 完成:

按下按钮,我需要从 Excel 中的工作表中读取数据,解析值并将它们导出到 Web 服务器,该服务器读取数据并将其写入服务器上的文件中。在 Windows 上,一切都很顺利,使用 MSXML2.ServerXMLHTTP 和所有,但在 Mac 上是不可能的(这种对象是 ActiveX 的一部分)。

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
objHttp.SetOption 2, objHttp.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
objHttp.Open "POST", myURL, False
objHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHttp.SetRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.SetRequestHeader "Authorization", "Basic " & Base64Encode(Username & ":" & Password)
objHttp.Send (strOutput)

从这个线程: How can I send an HTTP POST request to a server from Excel using VBA? ,我尝试使用查询表没有任何成功(我总是得到“找不到服务器”错误,即使我三次检查了地址和所有。)
With ActiveSheet.QueryTables.Add(Connection:="URL;https://myurl.com/index.php", Destination:=Range("K1"))
.PostText = strOutput
.RefreshStyle = xlOverwriteCells
.SaveData = True
.Refresh
End With

我也尝试通过 curl 命令发送数据,但我似乎无法找到如何从 VBA 中正确执行它。
 sCmd = "curl " & _
"-u " & Username & ":" & Password & _
" -d " & Chr(34) & data & Chr(34) & _
" " & url

因此,如果有人对我应该如何完成这项任务有任何想法,我将不胜感激。非常感谢。

编辑:添加了我失败的尝试

最佳答案

好的,所以我做了进一步的研究,我终于找到了一些有用的东西,使用 cURL。为了实现它,我们必须创建一个这样的函数(这是我在这里找到的函数 VBA Shell function in Office 2011 for Mac ):

Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long
Private Declare Function pclose Lib "libc.dylib" (ByVal file As Long) As Long
Private Declare Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As Long, ByVal items As Long, ByVal stream As Long) As Long
Private Declare Function feof Lib "libc.dylib" (ByVal file As Long) As Long

Function execShell(command As String, Optional ByRef exitCode As Long) As String
Dim file As Long
file = popen(command, "r")

If file = 0 Then
Exit Function
End If

While feof(file) = 0
Dim chunk As String
Dim read As Long
chunk = Space(50)
read = fread(chunk, 1, Len(chunk) - 1, file)
If read > 0 Then
chunk = Left$(chunk, read)
execShell = execShell & chunk
End If
Wend

exitCode = pclose(file)
End Function

基本上,这个功能允许我们在 Mac 上调用 shell 命令,而无需经历将 Mac 命令转换为 Windows 格式的所有努力。

完成后,调用此函数,第一个参数是命令行(cURL 格式),第二个参数是对系统返回的退出代码的引用(而不是 cURL 请求!)。然后 cURL 命令将返回 http 响应。所以这样的事情会起作用:
Dim command As String
command = "usr/bin/curl http://www.myserver.com -d "data" -X POST ..."

Dim exitCode As Long
Dim result As String

result = execShell(command, exitCode)

注意我是如何开始我的 cURL 请求的。您必须编写 cURL 的路径(在本例中为“usr/bin/curl”),以便系统找到 cURL 的位置,否则它将无法工作(它可能会工作,但这样我们可以确保它始终工作)

跨平台兼容性

请注意,如果它在 Windows 上,这个解决方案将不起作用,因为它没有“libc.dylib”库,所以你必须检查操作系统并在 Windows 上实现一种方法(如所写在问题中)
Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
objHttp.SetOption 2, objHttp.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
objHttp.Open "POST", myURL, False
objHttp.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHttp.SetRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.SetRequestHeader "Authorization", "Basic " & Base64Encode(Username & ":" & Password)
objHttp.Send (strOutput)

关于macos - 从 VBA Excel for Mac 在 HTTP Post 中发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com