Bonjour,
J'ai le code VBA suivant qui me permet d'obtenir une URL à partir d'un fichier xml. Le code fonctionne bien en synchrone, mais excel se bloque le temps de récupérer le ficher xml ; j'essaie donc de faire la même chose en asynchrone en utilisant un gestionnaire d'événements. Voici le code :
Le code fonctionne en mode pas à pas car la requête a le temps de s'exécuter, cependant, en fonctionnement normal xmlDoc.readyState est bien égal à 4 alors que ce n'est pas encore prêt, donc fin de la macro.
J'ai le code VBA suivant qui me permet d'obtenir une URL à partir d'un fichier xml. Le code fonctionne bien en synchrone, mais excel se bloque le temps de récupérer le ficher xml ; j'essaie donc de faire la même chose en asynchrone en utilisant un gestionnaire d'événements. Voici le code :
Code:
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private xmlDoc As MSXML2.DOMDocument30
Private Function xmlDoc_onreadystatechange()
Dim objNodeList As IXMLDOMNodeList
Dim objNode As IXMLDOMNode
Dim hwnd As Long
Dim URL As String
If (xmlDoc.readyState = 4) Then
If (xmlDoc.parseError.ErrorCode = 0) Then
xmlDoc.setProperty "SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"
xmlDoc.setProperty "SelectionLanguage", "XPath"
Set objNodeList = xmlDoc.DocumentElement.getElementsByTagName("PartFormURL")
For Each objNode In objNodeList
URL = Left(objNode.Text, Len(objNode.Text) - 9) & "Locale=fr_fr&ViewType=Service&Extend=.html"
Next objNode
ShellExecute hwnd, "open", URL, "", "", vbNormalFocus
End If
End If
End Function
Private Function isValidPart(part As String)
isValidPart = (Left(part, 3) = "std")
End Function
Public Sub OPEN_URL(part As String)
xmlDoc.async = True
If isValidPart(part) Then
Set xmlDoc = New MSXML2.DOMDocument30
xmlDoc.Load " http://www.[adresseintranet].com/xmlQuery/xmlQuery?action=ficheArticle&code=" & UCase(Left(part, 13))
xmlDoc.onreadystatechange = xmlDoc_onreadystatechange
End If
End Sub
Le code fonctionne en mode pas à pas car la requête a le temps de s'exécuter, cependant, en fonctionnement normal xmlDoc.readyState est bien égal à 4 alors que ce n'est pas encore prêt, donc fin de la macro.