Почему эта функция получения данных 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 на случайное время. Это не помешало функции зависать.

Краткое содержание:

  • Функция работает, если она приостановлена ​​точкой останова в начале цикла.
  • Он зависает, если вызывается без точки останова или с точкой останова после этого цикла.

Что может быть причиной зависания этой функции и что я могу изменить, чтобы она заработала?

0 ответов

Другие вопросы по тегам