2017-01-30 3 views
0

私はvbaのクラスプログラミングには新しいです。ここでクラスインスタンスからデータを取得する方法

は の指導を使用して、私の最初の試みである:Asynchronous HTTP POST Request in MS Access

私はワードVBAを使用しています。ここで

は、ここに私のCXMLHTTPHandler.cls

VERSION 1.0 CLASS 
BEGIN 
    MultiUse = -1 'True 
END 
Attribute VB_Name = "CXMLHTTPHandler" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = False 
Attribute VB_Exposed = False 
Option Explicit 
Dim m_xmlHttp As MSXML2.XMLHTTP 

Public Sub Initialize(ByRef xmlHttpRequest As MSXML2.XMLHTTP) 
    Set m_xmlHttp = xmlHttpRequest 
End Sub 

Sub OnReadyStateChange() 
Attribute OnReadyStateChange.VB_UserMemId = 0 
    Debug.Print m_xmlHttp.readyState 
    If m_xmlHttp.readyState = 4 Then 
     If m_xmlHttp.Status = 200 Then 
     msgbox m_xmlHttp.responseText 
     Else 
     msgbox "Something Went Wrong" 
    End If 
    End If 
End Sub 

である私の標準モジュール

Option Explicit 
Public xmlHttpRequest As MSXML2.XMLHTTP 
Function sasynchreq(url As String) 
On Error GoTo FailedState 
If Not xmlHttpRequest Is Nothing Then Set xmlHttpRequest = Nothing 
Dim MyXmlHttpHandler As CXMLHTTPHandler 
Set xmlHttpRequest = New MSXML2.XMLHTTP 
'Create an instance of the wrapper class. 
Set MyXmlHttpHandler = New CXMLHTTPHandler 
MyXmlHttpHandler.Initialize xmlHttpRequest 
'Assign the wrapper class object to onreadystatechange. 
xmlHttpRequest.OnReadyStateChange = MyXmlHttpHandler 
'Get the page stuff asynchronously. 
xmlHttpRequest.Open "GET", url, True 
xmlHttpRequest.send "" 
Exit Function 
FailedState: 
    msgbox Err.Number & ": " & Err.Description 
End Function 

Sub test() 
    Dim url As String, do_something As String 
    url = "http://httpbin.org/html" 
    do_something = sasynchreq(url) 
    'do somethign with do_something 
End Sub 

すべてが正常に動作しています。たとえば、テストサブなどの変数にhttprequestを割り当てる場合はどうすればよいですか?

答えて

1

Propertyの文のようです。あなたの場合、Property Gethttps://msdn.microsoft.com/en-us/library/office/gg264197.aspx)になります。あなたのクラスモジュールで

、この置く:これは今、クラス変数へのごモジュールへのアクセスを提供します

Public Property Get HttpRequest() As MSXML2.XMLHTTP 
    Set HttpRequest = m_xmlHttp 
End Property 

は、そのよう:

Dim rq as MSXML2.XMLHTTP 
set rq = MyXmlHttpHandler.HttpRequest 
+0

ありがとうございました。私は欠けている部分がコールバックを待っていると思います。 – Rahul

+0

申し訳ありませんが、私はあなたの質問に誤解しました。あなたのリンクを読むまでは、VBAでは非同期タスクが不可能だと思っていました。私は、「待っている」結果と同等のものを得る方法がわからないのではないかと心配しています。おそらく、オブジェクトを取得する方法とタイミングを表示するために質問を編集します。コードのその部分を 'OnReadyStateChange'ルーチンの中に置くことさえあるかもしれません。 – Ambie

0

私はあなたが上の前提究極のペイロードを期待することができると思います関数を終了するまでにSendメソッドが存在する必要があります。もしそうなら、あなたの関数の署名のようなものになります。

Function sasynchreq(url As String) As String 

や関数の本体内に、あるはず:

xmlHttpRequest.send "" 
sasynchreq = xmlHttpRequest.responseXML.xml 

またはそのような何か。その後、すぐに使用できるようになる可能性があります。

短い話ですが、同期の問題がなければ、現在書かれている方法で、関数はdo_somethingに何も返されません。何が返ってきても、サブテスト内の関数のシグネチャとローカル変数の型は一致する必要があります。オブジェクトを返す場合は、両方のインスタンスでSetキーワードを使用する必要があります。

関連する問題