Как я могу получить HTTP GET из Excel VBA для Mac 2011
Мне нужно выдать HTTP Get с строкой запроса в веб-службу из Excel для Mac 2011. Я видел ответы на использование QueryTables ( как я могу отправить HTTP POST-запрос на сервер из Excel с помощью VBA? ), Но они используйте метод POST, а не метод GET. Я также вижу, что это легко с Windows-машины, но я застрял на Mac.
Любые предложения, или это безнадежно?
- Показывать или скрывать строки в листе excel при значении конкретной ячейки (excel 2007 и Windows 7)
- Как получить путь к текущему рабочему листу в VBA?
- Excel VBA: автозаполнение нескольких ячеек с формулами
- Vba Excel делает vlookup из закрытого файла
- В чем разница между dim и set в vba
- excel VBA автоматически запускает макрос всякий раз, когда изменяется ячейка
- Функция сортировки массива VBA?
- Использование VBA для получения расширенных атрибутов файла
- VBA-подзаголовок вне допустимого диапазона - ошибка 9
- Кнопка добавления / вычитания Excel VBA
- скрытие формул в строке формул
- Функция Excel VBA работает в Visual Basic, но не работает в рабочем листе
- Функция Dir () не работает в Mac Excel 2011 VBA
Проводя дальнейшие исследования, я встретил комментарий Роберта Найта по этому вопросу 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