Как я могу получить HTTP GET из Excel VBA для Mac 2011

Мне нужно выдать HTTP Get с строкой запроса в веб-службу из Excel для Mac 2011. Я видел ответы на использование QueryTables ( как я могу отправить HTTP POST-запрос на сервер из Excel с помощью VBA? ), Но они используйте метод POST, а не метод GET. Я также вижу, что это легко с Windows-машины, но я застрял на Mac.

Любые предложения, или это безнадежно?

Проводя дальнейшие исследования, я встретил комментарий Роберта Найта по этому вопросу VBA Shell в Office 2011 для Mac и построил функцию HTTPGet, используя функцию execShell для вызова curl. Я тестировал это на Mac с Mac OS X 10.8.3 (Mountain Lion) с Excel для Mac 2011. Вот код VBA:

Option Explicit ' execShell() function courtesy of Robert Knight via StackOverflow ' https://stackoverflow.com/questions/6136798/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 Function HTTPGet(sUrl As String, sQuery As String) As String Dim sCmd As String Dim sResult As String Dim lExitCode As Long sCmd = "curl --get -d """ & sQuery & """" & " " & sUrl sResult = execShell(sCmd, lExitCode) ' ToDo check lExitCode HTTPGet = sResult End Function 

Чтобы использовать это, скопируйте приведенный выше код, откройте редактор VBA в Excel для Mac 2011. Если у вас нет модуля, нажмите «Вставить-> Модуль». Вставьте код в файл модуля. Оставьте редактор VBA (clover-Q).

Вот пример использования веб-службы outlookа погоды ( http://openweathermap.org/wiki/API/JSON_API )

Ячейка A1 будет зарезервирована для названия города.

В ячейке A2 введите строку URL: http://api.openweathermap.org/data/2.1/forecast/city

В ячейке A3, которая построит строку запроса, введите: ="q=" & A1

В ячейке A4 введите: =HTTPGet(A2, A3)

Теперь введите название города в ячейке A1, например London , ячейка A4 покажет вам ответ JSON, содержащий outlook погоды для Лондона. Измените стоимость в A1 от London до Moscow – A4 изменится на outlook JSON для Москвы.

Очевидно, что, используя VBA, вы можете анализировать и переформатировать данные JSON и размещать их там, где это необходимо на вашем листе.

Нет претензий в отношении производительности или масштабируемости, но для простого однократного доступа к веб-службе из Excel для Mac 2011 это, похоже, делает трюк и отвечает требованиям, для которых я разместил свой оригинальный вопрос. YMMV !

Ответ выше от Джона Стивенса фантастичен (пожалуйста, повысьте его!), Но он больше не работал для меня в более позднем Excel: mac 2016 с ошибкой, что код необходимо обновить для использования в 64-битных системах.

Принимая несколько советов по проблеме, которую я нашел в соответствующем репозитории , мне удалось настроить типы данных в сценарии Джона для правильной работы в Excel: mac 2016:

 Option Explicit ' execShell() function courtesy of Robert Knight via StackOverflow ' http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac Private Declare PtrSafe Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As LongPtr Private Declare PtrSafe Function pclose Lib "libc.dylib" (ByVal file As LongPtr) As Long Private Declare PtrSafe Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As LongPtr, ByVal items As LongPtr, ByVal stream As LongPtr) As Long Private Declare PtrSafe Function feof Lib "libc.dylib" (ByVal file As LongPtr) As LongPtr Function execShell(command As String, Optional ByRef exitCode As Long) As String Dim file As LongPtr 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 Function HTTPGet(sUrl As String, sQuery As String) As String Dim sCmd As String Dim sResult As String Dim lExitCode As Long sCmd = "curl --get -d """ & sQuery & """" & " " & sUrl sResult = execShell(sCmd, lExitCode) ' ToDo check lExitCode HTTPGet = sResult End Function 

Другой вариант (обновите соответственно, если ваш curl не находится в / opt / local / bin / curl):

VBA:

 Public Function getUrlContents(url) As String Dim command As String command = "do shell script ""/path_to/getUrl.sh " + url + """" getUrlContents = VBA.MacScript(command) End Function 

/path_to/getUrl.sh:

 #!/bin/sh if [ -z "$1" ] then echo "missing url argument" else /opt/local/bin/curl "$1" fi 

Обратите внимание, что вам необходимо убедиться, что getUrl.sh является исполняемым:

 chmod u+x getUrl.sh 
  • Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри ячейки, так и в цикле
  • В чем разница между .text, .value и .value2?
  • Попытка открыть книгу в отдельном экземпляре
  • «Не удается найти проект или библиотеку» для стандартных функций VBA
  • Сохранение листа Excel в CSV-файлах с именем файла + имя листа с использованием VB
  • Лучше ли использовать ADO или DAO в Access 2007?
  • Заполнение уникальных значений в массиве VBA из Excel
  • Excel VBA Управление локальной локальной сетью IE
  • Элементы управления Microsoft Excel ActiveX отключены?
  • Как создать и записать в txt-файл с помощью VBA
  • Ссылка на Excel Userform Control Имя Значение из строки (VBA)
  • Давайте будем гением компьютера.