Macro qui utilise IE ne marche plus sous Windows 7

Résolu
joey_nmuk -  
Valéry01 Messages postés 9 Statut Membre -
Bonjour,

Dans le cadre du travail, je dois faire des extractions de données en remplissant un formulaire assez régulièrement, sur une page intranet. Donc, J'ai créé une macro excel qui marche très bien sous XP mais plus sous Windows 7 (j'ai migré vers W7). J'utilise office pro 2010.
Cette macro ouvre internet explorer, remplit certains champs et puis appuie sur un bouton.
Les champs ont été repérés en utilisant le code de la page HTML.
Sous W7, la page s'ouvre bien mais les champs ne sont pas renseignés

J'ai une fonction qui me sert de tempo pour donner le temps à IE de prendre en compte mes manip.

Est-ce que sous windows 7, il faut une librairie spéciale pour pouvoir utiliser les fonctionnalité d'IE?
J'ai les références suivantes :
- Microsoft office 14.0 Object library
- Microsoft HTML Object Library
- Microsoft Internet Controls
- OLE automation
- Visual basic for Applications
- Microsoft Excel 14.0 Object Library

Voici le code simplifié

Sub ExtractFromLB()

On Error GoTo fin
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")

'Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument

IE.navigate "http://www" ' l'adresse a été enlevé car c'est un site intranet
IE.Visible = True

Call WaitIE(IE)
Set IEDoc = IE.document
Call WaitIE(IE)
IEDoc.all("drpProfile").Value = "5969"
Call WaitIE(IE)
IEDoc.all("lnkExpand").Click
Call WaitIE(IE)
IEDoc.all("dfFuncGrpFrom$ctl01").Value = "2861"
Call WaitIE(IE)
IEDoc.all("dfFuncGrpTo$ctl01").Value = "2862"
Call WaitIE(IE)
IEDoc.anchors("btnExcelExport").Click
Set IE = Nothing
Exit Sub

End Sub

Sub WaitIE(IE2 As InternetExplorer)
Dim Nowa As Date
Nowa = Now
Do While IE2.Busy
Application.Wait DateAdd("s", 1, Now)
If Now > DateAdd("s", 3000, Nowa) Then Call Animation.Killmacro("No IE answer")
Loop
End Sub

6 réponses

  1. CaRoule
     
    Hello les guys!
    J'ai trouvé!!
    Remplacé le code :

    Dim IE As Object
    Set IE = 'CreateObject("InternetExplorer.Application")


    PAR
     Dim IE As Object
     Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 


    et le miracle se produit.
    C'est une histoire à base de registre et de protect mode d'IE.
    11
    1. Nicky22140 Messages postés 1 Statut Membre
       
      Punaise t'es un Warrior !
      3 jours que je me galere avec mon ancien code a mettre au gout de Win7, et que je me farcis tous les forums excel/VBA en vain
      You save my life thx!
      0
    2. déon
       
      trop fort :)
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pour répondre à ta question : Est-ce que sous windows 7, il faut une librairie spéciale pour pouvoir utiliser les fonctionnalité d'IE?
    La réponse est non, seules sont utiles les deux références suivantes :
    - Microsoft HTML Object Library
    - Microsoft Internet Controls

    Par contre, si tes "champs" ne se remplissent pas, c'est, à mon avis, parce qu'ils ne sont pas clairement identifiés.
    Si tes champs sont de type "input", avec un "id" personnel, je n'utiliserai pas .all pour les identifier, mais l'élément html Input : HTMLInputElement, s'ils sont de type link, utiliser HTMLLinkElement.
    Voici un exemple :
    Sub test()
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim HtmlElemUtilisateur As HTMLInputElement
    Dim HtmlElemPassword As HTMLInputElement
    Dim Valider As HTMLLinkElement
    
    IE.navigate "[http://]"
    IE.Visible = True
    WaitIE
    Set IEDoc = IE.document
    'ici on affecte à notre variable HtmlElemUtilisateur l'élément input de la page html dont l'id est "j_username"
    Set HtmlElemUtilisateur = IEDoc.getElementById("j_username")
    'idem avec l'id "j_password"
    Set HtmlElemPassword = IEDoc.getElementById("j_password")
    
    'on remplit les champs input correspondants avec des valeurs
    HtmlElemUtilisateur.Value = "Utilisateur"
    HtmlElemPassword.Value = "azerty123"
    
    'on affecte à notre variable Valider l'élément link de notre page html ayant pour id "btnAction"
    Set Valider = IEDoc.Links("btnAction")
    'on clic
    Valider.Click
    End Sub
    
    Sub WaitIE()
    Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
    End Sub


    Sache également que l'on peux déclencher une fonction javascript depuis VBA. La syntaxe est :
    IEDoc.parentWindow.execScript "NomDeLaFonction;", "javascript"


    Après cela, sans élément supplémentaire (extraits du code source de la page html) il sera très difficile de t'aider davantage.
    Cordialement,
    Franck P
    0
  3. CaRoule
     
    Merci pour ton aide pijaku.
    joey_nmuk, j'ai le même problème, tout marche bien sous XP, je passe à Windows 7 et le code bloque au nieau de
    IE.visible = true.
    "L'instance n'existe pas".
    Je continue mes recherches
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,
      De rien...

      Avant la ligne :
      IE.Visible = True

      as tu bien ces lignes de code :
      Dim IE As Object
      Set IE = CreateObject("InternetExplorer.Application") 


      Sinon, pour faciliter vos recherches, regardez ce super tuto!!!
      0
    2. CarRoule
       
      non, j'ai mis
      Dim IE As New InternetExplorer
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      as tu été voir le tutoriel donné précédemment?
      0
  4. joey_nmuk Messages postés 1 Statut Membre
     
    SAlut,
    C'est ce tuto qui m'a fortement inspiré.
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,
      As-tu essayé de remplacer :
      Dim IE As New InternetExplorer
      
      IE.navigate "http://blablabla"
      IE.Visible = True


      par :
      Dim IE As Object
      Set IE = CreateObject("InternetExplorer.Application") 
      IE.navigate "http://blablabla"
      IE.Visible = True


      Perso, je suis sous W7 avec IE9 et n'ai aucun souci, ni avec l'un, ni avec l'autre, du moment ou les références sont bien cochées.......
      0
    2. CaRoule
       
      Oui mais sans progrès.
      Il semblerait que le problème puisse venir de conflit lié au version 32 et 64 bit d'IE.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Alors je n'ai pas de solution.
      Désolé.
      A+
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Valéry01 Messages postés 9 Statut Membre
     
    Bonjour,

    Peut-être une idée de piste à creuser:
    Ma macro (avec "fonction IE. ") fonctionne sous :
    - XP Excel 2007 IE8
    - W7 32 Excel 2007 IE8
    - W7 64 Excel 2010 IE11

    J'essaie de la faire fonctionner sous W7 64 Excel 2007 IE11 et j'obtiens l'erreur :
    Erreur de compilation :
    Mécanisme de bibliothèque d'objet non géré
    sur :
    IEDoc dans:
    Set IEDoc = IE.document

    bien entendu dans la déclaration j'ai :
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument

    et sur le PC en question j'ai bien intégré les références : « Microsoft Internet Controls » et « Microsoft HTML Object Library ».

    La seule différence c'est Excel 2007 / Excel 2010 ?

    En relisant le post une deuxième voir une troisième fois j'ai LA SOLUTION :

    sous le pc W7 64 Excel 2007 IE11
    j'ai remplacé :
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    par :
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")

    Et ça fonctionne
    Merci Pijaku

    Désolé je n'ai pas utilisé les balises HTML pour présenter mon message
    0