2016-08-24 73 views
1

MSXML2.serverXMLHTTPオブジェクトを使用して、特定のURLのHTTPステータスを返すこの便利なVBA関数を作成しました。この関数は同期的に実行され、要求が解決されるまでコードの残りの部分はフリーズします。これを非同期呼び出しにするにはどうすればよいですか?VBA HTTPを使用した非同期データ呼び出し

現在の作業機能:

Function page_http_status(url) As String 

      Dim XMLHTTP As Object 

      Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP") 
      XMLHTTP.Open "GET", url, False 
      XMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
      XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0" 

      XMLHTTP.send 
      page_http_status = XMLHTTP.Status 

End Function 

onreadystatechangeに試行

私は名前のコールバック関数をトリガすることができますXMLHTTP.onreadystatechangeイベントがある知っているが、どのように私はこれをトリガすることができます関数はの値を返します。page_http_status()

XMLHTTP.onreadystatechange = FunctionReadyStateChange 

、その後

Function FunctionReadyStateChange() 

MsgBox ("Request received! " & XMLHTTP.Status) 

End Function 
+0

https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx - 第3パラメータに注意してください。 – user2864740

+0

要求が非同期に処理された場合、要求が完了していないため、関数*は応答に基づいて文字列を返すことができません。 – user2864740

+0

あなたの 'XMLHTTP'は、イベントがとにかく起こる前に範囲外に出るでしょう。 'XMLHTTP'を関数の外で、おそらくモジュール内で' Public'として定義してください。 –

答えて

0

はさらに読みになった後、私はVBAは、単に箱から出してコールバック関数をサポートしていないことに気づきました。 XMLHTTP.onreadystatechangeを使用して

は実行可能なソリューションですが、それは周りの2制限動作するように必要になります。

1)XMLHTTP「コールバック」で使用可能なオブジェクトの範囲を維持するために公に宣言する必要があります(この結構です)。

2)元の関数は値を返すことができなかったので、出力を(出力を返す「スカラー」関数ではなく)プロシージャに保存する必要がありました。

関連する問題