Отправить данные в HTTP Post из VBA Excel для Mac

Поэтому у меня есть задача сделать в Excel для Mac, используя VBA:

При нажатии кнопки мне нужно прочитать данные из листа в Excel, проанализировать значения и экспортировать их на веб-сервер, который считывает данные и записывает их в файл на сервере. В 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) 

Из этого потока: Как я могу отправить HTTP POST-запрос на сервер из Excel с помощью 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 

Поэтому, если у кого-то есть идея о том, как я должен выполнять эту задачу, я был бы очень благодарен. Большое спасибо.

EDIT: добавлены неудачные попытки

Хорошо, поэтому я провел дальнейшие исследования, и я наконец нашел что-то, что работает, используя cURL. Чтобы это сделать, мы должны сделать такую ​​функцию (это функция, которую я нашел здесь, функция VBA Shell в Office 2011 для 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, без необходимости проходить всю борьбу с преобразованием команд 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, иначе это не сработает (это может сработать, но таким образом мы убеждаемся, что он всегда будет Работа)

Кросс-платформенная совместимость

Обратите внимание, что это решение, однако, не будет работать, если оно находится в окнах, поскольку у него нет librairies 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) 

Для более высокой версии, чем Mac Excel 2011, я рекомендую это.

Скажем, мы вызываем « http://example.com?q=hello&t=now » с помощью действия POST.

 Private Declare PtrSafe Function system Lib "libc.dylib" (ByVal command As String) As Long Function getHTTPPost(sUrl As String, sQuery As String) As Long sCmd = "curl -v -X POST -d '" & sQuery & "' " & sUrl exitCode = system(sCmd) End Sub 

Затем мы можем использовать следующее:

 ans = getHTTPPost("http://example.com", "q=hello&t=now") 

Но мы хотели бы считать, что мы не можем получить строку ответа этим кодом.

Просто надейтесь, что это поможет вам с вашей озабоченностью HTTP Post Request в Mac VBA Office 2016.

  • книга не открывается, когда открытие вызывается из книги, которая сама открыта третьей книгой
  • VBA открывает / закрывает книги по ошибкам MAC-бросков
  • MAC OS Laravel Excel не работает
  • Каков правильный синтаксис VBA для метода Refresh объекта QueryTables?
  • Как изменить строку user-agent в веб-кадре Excel?
  • F # или C # на основе Excel надстройка на OSX
  • Формула массива в Excel для Mac
  • Как создать веб-запрос в Mac Excel 2011?
  • Excel для Mac 2011 - ошибка во время выполнения '-2147483640 (80000008)'
  • Команда Node через пользовательскую функцию Shell завершает работу с 32512
  • Найти и заменить в Excel 2011 с помощью Applescript
  • Interesting Posts

    Условное форматирование в листах – форматирование двух ячеек на основе одного

    Python добавляет новый столбец к существующему листу в excel

    Python с использованием openpyxl, load_workbook, grab pattern и значением печати ячейки

    Сохранить файл AS excel в определенном месте с помощью макроса

    Формула для предоставления последней даты для указанного элемента

    Совет о том, как передать строки из листа excel в инструмент командной строки

    Обновление соединения данных без обновления подключенного стержня

    сохранить книгу с openpyxl в ironpython

    Excel VBA – Чрезвычайно медленная окраска клеток

    Excel VBA – Пропустить суб или конец под IF-заявлением

    Пользовательский формат excel cell умножается на 1000

    Excel: отображение значения из списка параметров, если числа начинаются со значения из параметров

    Разделите информацию на: и нажмите вторую часть на другой лист в Excel

    Доступ к встроенным элементам HTML с помощью VBA Web Automation

    Формулы Excel для панели управления call-центра

    Давайте будем гением компьютера.