Как быстро и просто выполнять HTTP-запросы к web-серверу из VBA

О чем эта статья?

Я немного занимаюсь программированием, откровенно говоря по большей части это говно-код, но я и не настоящий сварщик. И так вышло что в ру-нете неплохо освещены азы, чуть хуже вопросы посложнее, а некоторые вопросы либо не освещены вовсе, либо подавляющее большинство пишет что это невозможно в принципе или невозможно без изобретения велосипедов. А может я просто плохо гуглил. В общем понадобилось мне однажды выполнять GET и POST запросы из VBA, это не сложный в общем-то язык для офисного пакета Microsoft, в этой статье вы узнаете как без установки сторонних компонент, изобретения велосипедов и прочего общаться с серверами в Интернет из Excel, Access или других офисных приложений.

Как работать с Веб-серверами из VBA?

Первым делом нужно открыть редактор VBA и подключить библиотеку Microsoft XML -> Tools -> References — в списке находим нужную библиотеку и ставим галочку: В зависимости от версии офиса, установленных обновлений и другого софта у вас в списке могут быть разные версии, выбирать можно любую: 1. Microsoft XML, v 3.0. 2. Microsoft XML, v 4.0 (если установлен пакет MSXML 4.0). 3. Microsoft XML, v 5.0 (устанавливается вместе с  Office 2003 – 2007). 4. Microsoft XML, v 6.0 устанавливается с последними версиями MS Office 2010 и новее. У меня в системе были все из списка, я пробовал разные и со всеми работало, решил подключить самую новую.

А далее все просто, вот пример GET-запроса:

Private Sub get_zaproz_from_VBA_Click() ' это кнопка на форме
Dim xmlhttp As New MSXML2.XMLHTTP60, myurl As String
myurl = "https://kakpedia.org"
xmlhttp.Open "GET", myurl, False
xmlhttp.Send
MsgBox (xmlhttp.responseText)
End Sub
И если все сделано верно, то откроется окошко с Html-кодом, который отдал сервер. Некоторые серверы ничего не отдадут (например гугл мне почему-то отказался отвечать) — это нормально, пробуйте несколько.

Задать если необходимо, HTTP-заголовки можно вот так:

xmlhttp.setRequestHeader "Content-Type", "text/json"
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.setRequestHeader "User-Agent", "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405"
xmlhttp.setRequestHeader "Authorization", AuthCredentials

POST-запрос из VBA:

Public Sub post_zapros_from_VBA()
Dim xmlhttp As New MSXML2.XMLHTTP, myurl As String
myurl = "Сюда впишите адрес формы"
xmlhttp.Open "POST", myurl, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xmlhttp.Send "name=codingislove&email=admin@codingislove.com"
MsgBox (xmlhttp.responseText)
End Sub

Простая авторизация:

user = "логин"
password = "пароль"
xmlhttp.setRequestHeader "Authorization", "Basic " + Base64Encode(user + ":" + password)