![この VBA データ取得関数が Access でハングするのはなぜですか?](https://rvso.com/image/1671466/%E3%81%93%E3%81%AE%20VBA%20%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97%E9%96%A2%E6%95%B0%E3%81%8C%20Access%20%E3%81%A7%E3%83%8F%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
VBA にこの関数があり、以前は Excel で URL からデータを取得するために使用していました。
'========================================================
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()
'========================================================
現在、この関数を別の関数から呼び出しています。この関数は、Access のクエリから呼び出しています。これを実行すると、この関数を中断せずに実行しようとすると、呼び出しがハングします。ただし、次の行にブレークポイントを設定すると、
Do While oRequest.ReadyState <> nProcessComplete
そして、VBA に続行するように指示すると、実行されます。ただし、そのブレークポイントを削除して、次の行にブレークポイントを設定すると、
sResponse = .responseText
その後、ハングします。
したがって、この関数が Access から呼び出されると、ループに入る前にブレークポイントによって一時停止するように指示されない限り、ループでハングするようです。
VBA をランダムな時間一時停止する関数の呼び出しを挿入して一時停止を自動化しようとしました。それでも関数がハングするのを防ぐことはできませんでした。
まとめ:
- この関数は過去に Excel で動作していました。
- ループの先頭でブレークポイントによって一時停止されている場合、Access で動作します。
- ブレークポイントなしで Access で呼び出されるとハングします。
この関数が Access でハングする原因は何でしょうか。また、これを動作させるには何を変更すればよいでしょうか。