Почему эта функция получения данных VBA зависает?
Я написал эту функцию на VBA для получения данных по URL-адресу. Я вызываю его из другой функции, которая вызывается в запросе Access. Код адаптирован из кода в статье, цитируемой в комментариях к коду:
'========================================================
Public Function sURLfetch(ByVal sURL As String) As String
'========================================================
' Return data found at a URL.
' From "www.MyExcelGenius.com/getting-data-from-a-website-in-json-format-using-vba/".
' Requires reference "Microsoft XML, v6.0".
Const bRunAsynch As Boolean = True
Const nProcessComplete As Integer = 4
Dim oRequest As MSXML2.XMLHTTP60
Set oRequest = New MSXML2.XMLHTTP60
Dim sResponse As String
With oRequest
.Open "get", sURL, bRunAsynch
.setRequestHeader "Content-Type", "application/json"
.send
Do While oRequest.ReadyState <> nProcessComplete
DoEvents
Loop
sResponse = .responseText
End With
sURLfetch = sResponse
'========================================================
End Function ' sURLfetch()
'========================================================
Когда эта функция вызывается, VBA зависает. Но вот что странно: если я установлю точку останова на строке:
Do While oRequest.ReadyState <> nProcessComplete
а затем скажите VBA продолжить оттуда, тогда он работает нормально и возвращает желаемый результат. Он делает это снова и снова, возвращая правильную последовательность результатов, пока выполнение кода прерывается в этой точке останова, а затем продолжается. Однако, если я удалю эту точку останова и вместо нее установлю точку останова в строке сразу после цикла:
sResponse = .responseText
потом он зависает и я ничего не получаю.
Итак, по какой-то причине эта функция зависает в цикле, если ей не приказано сделать паузу в точке останова перед входом в цикл.
Цель цикла — убедиться, что процесс выборки завершился перед записью ответа. Я наблюдал за работой кода, и цикл обычно повторяется ноль или один раз. Когда оно повторяется, это означает, что выборка была неполной и ее необходимо завершить. Таким образом, цикл необходим для того, что я получаю. И по какой-то причине кажется, что он работает нормально, пока перед ним есть точка останова, но в остальном загадочным образом зависает.
The DoEvents
Функция, все содержимое цикла, просто сообщает VBA, чтобы позволить операционной системе делать все, что она делает, пока выполняется цикл. Этот вызов функции находится в исходном коде, адаптированном здесь, и в документации по функции от Microsoft и wellsr.
Я попытался автоматизировать паузу, вставив вызов функции, которая приостанавливает VBA на случайное время. Это не помешало функции зависать.
Краткое содержание:
- Функция работает, если она приостановлена точкой останова в начале цикла.
- Он зависает, если вызывается без точки останова или с точкой останова после этого цикла.
Что может быть причиной зависания этой функции и что я могу изменить, чтобы она заработала?