이 VBA 데이터 가져오기 기능이 정지되는 이유는 무엇입니까?

이 VBA 데이터 가져오기 기능이 정지되는 이유는 무엇입니까?

URL에서 데이터를 가져오기 위해 VBA로 이 함수를 작성했습니다. 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

그런 다음 멈추고 아무것도 얻지 못합니다.

따라서 어떤 이유에서든 이 함수는 루프에 들어가기 전에 중단점에 의해 일시 중지하라는 지시가 없는 한 루프에서 정지됩니다.

루프의 목적은 응답을 기록하기 전에 가져오기 프로세스가 완료되었는지 확인하는 것입니다. 코드의 동작을 관찰해 보니 루프는 대개 0번 또는 1번 반복됩니다. 반복되면 가져오기가 불완전하여 완료되어야 함을 의미합니다. 그래서 내가 가져오는 것에 루프가 필요합니다. 그리고 어떤 이유에서인지 앞에 중단점이 있는 한 제대로 작동하는 것처럼 보이지만 그렇지 않으면 알 수 없는 이유로 중단됩니다.

DoEvents루프의 전체 내용인 이 함수는 VBA에게 루프가 실행되는 동안 운영 체제가 수행하는 모든 작업을 수행하도록 지시합니다 . 해당 함수 호출은원본 코드여기저기서 기능에 대한 문서가 있습니다.마이크로소프트그리고우물.

임의의 시간 동안 VBA를 일시 중지하는 함수에 대한 호출을 삽입하여 일시 중지를 자동화하려고 했습니다. 그렇다고 해서 함수가 중단되는 것을 막지는 못했습니다.

요약:

  • 이 함수는 루프 시작 부분의 중단점에 의해 일시 중지된 경우 작동합니다.
  • 중단점 없이 호출되거나 해당 루프 이후에 중단점을 사용하여 호출되면 중단됩니다.

이 기능이 중단되는 원인은 무엇이며 작동하도록 하려면 무엇을 변경해야 합니까?

답변1

명령 asynch의 매개변수를 로 설정하는 데 문제가 있는 것 같습니다 . 그 설정OpenTrue요청이 완료되기 전에 중지되도록 허용, 이것이 DoEvents루프를 필요하게 만든 것입니다. 그래서 해당 매개변수를 로 변경 False하고 루프에 주석을 달았습니다. 그 이후에는 기능이 제대로 작동하는 것 같습니다.

왜 그런지 모르겠어요원본 코드asynch= True및 루프를 사용했습니다 . 그것 때문에 기능이 작동하지 않는 것 같습니다.

관련 정보