Вызов веб-службы VBA занимает время, и Excel переходит в режим «Не отвечает»

У меня есть этот вызов веб-службы в excel через VBA.

Req.Open "POST", MyURL, False
Req.setRequestHeader "Content-Type", "text/xml"

Req.send (sReq)

В этом Req.send (sReq) требуется время для ответа, когда длина sReq слишком велика. В это время Excel не отвечает, а затем возвращается к жизни и переходит к следующей строке кода.

Можете ли вы предложить, как я могу остановить мой Excel, который не отвечает на этом шаге?


person Govindaraj Thangavel    schedule 12.10.2017    source источник
comment
Dim Req As New MSXML2.XMLHTTP60 Dim MyURL, sReq As String   -  person Govindaraj Thangavel    schedule 12.10.2017


Ответы (1)


К сожалению, это невозможно с готовым Excel/VBA.

Чтобы Excel реагировал во время веб-запроса, вам нужно, чтобы он выполнялся асинхронно (в отдельном потоке), но, поскольку VBA работает в одном потоке, это невозможно.

Однако вы можете написать надстройку VSTO (Visual Studio Tools for Office) для Excel, используя VB.NET или C#.NET, это может добавить настраиваемую вкладку ленты, где вы можете поместить кнопку для асинхронного запуска вашего веб-запроса.

person Robbie188    schedule 12.10.2017
comment
Можем ли мы сделать то же самое и вернуться, чтобы выполнить оставшееся задание здесь? т. е. ответ от веб-запроса можно использовать обратно в VBA? У вас есть такой же код для этого? - person Govindaraj Thangavel; 12.10.2017
comment
Я так не думаю, но может быть способ сделать ваш API-вызов асинхронным в надстройке, а затем выполнить макрос или функцию VBA для выполнения постобработки с вашим результатом. Вы всегда можете просто обработать свой результат из надстройки. Не зная больше о том, что вы делаете, трудно советовать. - person Robbie188; 12.10.2017
comment
@GovindarajThangavel Я вижу, могу ли я опубликовать некоторый код, чтобы вы начали работу с надстройкой, но мне нужно будет использовать C # .NET для надстройки, и я понимаю, что это вопрос Excel / VBA. Вы в порядке с С#? - person Robbie188; 12.10.2017
comment
Я не знаю о кодировании C #. Так что это не моя чашка чая :) Я буду использовать свою текущую кодировку как есть. Спасибо за ваше время. - person Govindaraj Thangavel; 12.10.2017