我在 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
然后它挂起,我什么也没得到。
所以,由于某种原因,这个函数会挂在循环上,除非它被告知在进入循环之前通过断点暂停。
循环的目的是确保在记录响应之前获取过程已经完成。我看过代码的运行,循环一般会重复0次或1次。当它重复时,这意味着获取不完整并且需要完成。因此,对于我要获取的内容,循环是必要的。并且由于某种原因,只要它前面有一个断点,它似乎就可以正常工作,但否则会神秘地挂起。
该DoEvents
函数,即循环的全部内容,只是告诉 VBA 让操作系统在循环执行时做任何事情。该函数调用在此处改编的原始代码中,并且有Microsoft和wellsr的函数文档。
我试图通过插入对随机暂停 VBA 的函数的调用来自动暂停。这并没有阻止该功能挂起。
概括:
- 如果函数在循环开始时被断点暂停,则该函数起作用。
- 如果在没有断点或在该循环之后有断点的情况下调用它,它将挂起。
什么可能导致这个功能挂起,我可以改变什么来让它工作?