It doesn't matter if you are "post" ing or "GET" ing. Before this happens, you need to understand something.
- MS Access vba is single-threaded, so parallel or threaded execution is not possible, except for using external DLLs or small available hacks.
- In order to achieve “Asynchronous HTTP requests” or, in other words, tell VBA not to wait for an HTTP response, you need to hack a little callback class.
The process flow is as follows:
- Create your HTTP request
- add all parameters and everything else
- assign callback function
- Submit / Open MSXML2.XMLHTTP with [varAsyn] = True
- let vba continue to work on another code, as soon as an http response is received, the callback class will fire an event.
It is important . The callback function will be a class, and this class needs a hack.
[STEP1: preparing callback class]
Create a new class module in VBA, name it HTTP_HANDLER_CLASS with the following code:
Option Compare Database Option Explicit Dim m_xmlHttp As MSXML2.XMLHTTP Public Sub Initialize(ByRef xmlHttpRequest As MSXML2.XMLHTTP) Set m_xmlHttp = xmlHttpRequest End Sub Sub OnReadyStateChange() If m_xmlHttp.ReadyState = 4 Then If m_xmlHttp.status = 200 Then Debug.Print m_xmlHttp.responseText Else 'Error happened End If End If End Sub
[STEP2: modify / hack callback class]
- Now export the class and save it on your desktop as HTTP_HANDLER_CLASS.cls
- Open the exported class in any text editing tool.
- Add: "Attribute OnReadyStateChange.VB_UserMemId = 0" just below the sub-Sub SubReadyStateChange () "

- Go back to VBA and import the class (overwrite or delete the existing one)
This will make OnReadyStateChange () the default function we wanted to have, and so far you have performed the most important role:
[Step 3: sending requests in this example uses the SOAP action] Suppose you have access to the CallingServiceName web service, which takes two iEmail, iPassword and returns a string if the login was successful or not.
Module level variable: Public xmlHttpRequest As MSXML2.XMLHTTP Public Function HTTP_TEST() On Error GoTo FailedState If Not xmlHttpRequest Is Nothing Then Set xmlHttpRequest = Nothing Dim MyXmlHttpHandler As HTTP_HANDLER_CLASS 'our hacked call back class Set xmlHttpRequest = New MSXML2.XMLHTTP Dim sURL As String Dim sEnv As String sURL = "http://mydomain.co.uk/mywebsite/myservices.asmx?op=CallingServiceName" sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>" sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" sEnv = sEnv & " <soap:Body>" sEnv = sEnv & " <CallingServiceName xmlns=""http://mydomain.co.uk/"">" sEnv = sEnv & " <iEmail>username</iEmail>" sEnv = sEnv & " <iPassword>mypassword</iPassword>" sEnv = sEnv & " </CallingServiceName>" sEnv = sEnv & " </soap:Body>" sEnv = sEnv & "</soap:Envelope>" ' Now create an instance of our call-back class Set MyXmlHttpHandler = New HTTP_HANDLER_CLASS MyXmlHttpHandler.Initialize xmlHttpRequest ' Now attach the call-back class to our request, so whenever the request state changes, callback classs default function will fire. xmlHttpRequest.OnReadyStateChange = MyXmlHttpHandler ' seal the envelop and send it xmlHttpRequest.Open "Post", sURL, True ' here set varAsyn=true xmlHttpRequest.setRequestHeader "Host", "mydomain.co.uk" xmlHttpRequest.setRequestHeader "Content-Type", "text/xml; charset=utf-8" xmlHttpRequest.setRequestHeader "soapAction", "http://mydomain.co.uk/CallingServiceName" xmlHttpRequest.Send sEnv Debug.Print "Controller finished job" ' this is for you to realize vba will continue to work, the http result will be fired whenever the onstateChanges. Exit Function FailedState: 'MsgBox err.Number & ": " & err.description End Function
[Result] 
oh btw, Microsoft XML v3 is enough for this. 
The above example uses the SOAP version, but you can use any method. Please let me know if this helped.