Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/10/2011, 15h32   #1
Futur Membre du Club
 
Inscription : novembre 2007
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 71
Points : 17
Points : 17
Par défaut Erreur connexion page web avec VB

Bonjour,

Je cherche à récupérer des données d'une page Web dans Excel. La premiére chose est bien sur de se connecter au site.

J'ai récupéré un bout de code permettant de saisir aussi le login et l'identifiant. Le navigateur s'ouvre bien avec la page et la connexion au site se passe bien.

Par contre j'ai une erreur à la fin

Citation:
Erreur d'exécution '91:
Variable objet ou variable de bloc with non définie
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
sub connexion()
 
    Dim ie As InternetExplorer
    Dim IEdoc As Object
    Dim DOCelement As Object
 
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.Navigate ("http://www.xxxxx.org")
 
    ' attente de fin de chargement
    Do Until ie.ReadyState = 4
        DoEvents
    Loop
 
    Set IEdoc = ie.Document
 
    'login
     Set DOCelement = IEdoc.getElementsByName("vb_login_username").Item
     DOCelement.Value = "login"
 
    'password
     Set DOCelement = IEdoc.getElementsByName("vb_login_password").Item
     DOCelement.Value = "password"
 
    'connexion
     Set DOCelement = IEdoc.Forms(0)
     DOCelement.submit
 
 
End Sub
Est ce que quelqu'un peut me dire ou est l'erreur ?

Ensuite il faut que je choisisse une des menus dans la page comment je dois faire ??

D'avance merci
baime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 21h32   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Sur qu'elle ligne l'erreur ...? est tu sur de ton code html et des deux id : vb_login...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 13h57   #3
Futur Membre du Club
 
Inscription : novembre 2007
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 71
Points : 17
Points : 17
En fait l'erreur n'est pas sur une ligne particulière. quand je lance ma macro ça ouvre bien là page en mettant mon login password et ça se connecte. Mais ensuite si je reclique sur mon doc Excel j'ai le message d'erreur.

C'est surement qu'a la fin il faut que je redéfinisse qq chose pour revenir à la feuille Workbook("classeur").activate ne doit pas être bon.
baime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 23h16   #4
Futur Membre du Club
 
Inscription : novembre 2007
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 71
Points : 17
Points : 17
J'ai trouvé un code qui est sensé faire ce que je cherche j'ai essayé de l'adapter en me rajoutant des commentaires de tous les côtés mais j'ai toujours le même message d'erreur.

j'ai vérifié dans le code HTML il s'agit d'un formulaire post et les champs sont nommés user et pass ( j'avais fait une erreur au début mais ça change rien)

Code :
1
2
3
 
input type="text" name="user" id="user"
input type="password" name="pass" id="pass"
Est ce que c'est un pb de définition de référence ??

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
Option Explicit
 
Type AuthFormDef
  ' Adresse à atteindre
  URL As String
 
  ' Action du formulaire d'identification
  FormAction As String
 
  ' Nom du champ qui demande le nom d'utilisateur
  UserField As String
 
  ' Nom du champ qui demande le mot de passe
  PasswordField As String
 
  ' Valeur du champ Utilisateur
  UserValue As String
 
  ' Valeur du champ Mot de passe
  PasswordValue As String
End Type
 
 
Function ConnexionIE(afd As AuthFormDef)
 
  Dim ie As Object
  Dim doc As MSHTML.HTMLDocument
  Dim frm As MSHTML.HTMLFormElement
  Dim blnFormOK As Boolean
 
  ' Démarrer et afficher Internet Explorer
  On Error GoTo ConnexionIEErr
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = True
 
  ' Naviguer vers la page et attendre qu'elle soit chargée
  ie.navigate afd.URL
  While ie.Busy
    DoEvents
  Wend
 
  ' Identifier le formulaire demandé
  blnFormOK = False
  For Each frm In doc.forms
        If frm.Action = afd.FormAction Then blnFormOK = True
 
 
        ' Trouver et renseigner les champs Identifiant/Mot de passe
        ' du formulaire
        Dim obj As Object
        For Each obj In frm.elements
            If obj.Name = afd.UserField Then obj.Value = afd.UserValue
 
            If obj.Name = afd.PasswordField Then obj.Value = afd.PasswordValue
 
        Next
 
        ' Forcer l'envoi du formulaire
        frm.submit
        ConnexionIE = True
 
  Next
 
  ' Valeur de retour
  ConnexionIE = blnFormOK
  Exit Function
 
ConnexionIEErr:
  MsgBox "Erreur : " & Err.Number & vbCrLf _
    & Err.Description, vbExclamation
  ConnexionIE = False
  Exit Function
 
End Function
 
Sub TestConnexionIE()
 
  Dim afd As AuthFormDef
 
  ' Paramètres de la connexion
  With afd
    .URL = "http://teamhb.org"
    .FormAction = "http://teamhb.org/index.php"
    .UserField = "user"
    .PasswordField = "pass"
    .UserValue = "xxxx"
    .PasswordValue = "xxxx"
  End With
 
  ' Lancer la connexion
  If ConnexionIE(afd) Then
    MsgBox "Connexion établie !", vbInformation
  Else
    MsgBox "Echec de la connexion", vbExclamation
  End If
End Sub
Je suis à l'agonie
baime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 20h44   #5
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Ton 1er code est, à mon sens, plus en adéquation avec "ce qu'il est préférable de faire", je te conseil donc de persévérer avec celui-ci plutôt qu'avec l'autre.

Essai de libérer les objet une fois devenu inutile

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub connexion()
 
    Dim ie As InternetExplorer
    Dim IEdoc As Object
    Dim DOCelement As Object
 
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.Navigate ("http://www.xxxxx.org")
 
    '[...]
 
    'connexion
     Set DOCelement = IEdoc.Forms(0)
     DOCelement.submit
 
    'On libère les objets
    Set ie = nothing 'La fermeture de la page internet sera laissée à la charge de l'utilisateur
    Set IEDoc = Nothing
    Set DOCelement = Nothing
End Sub
Autre chose a vérifier, le fait que tu es cette erreur au retour sur la feuille Excel, n'aurais tu pas du code sur le Activate du Classeur?

Lorsque tu reviens sur ton Classeur, Internet Explorer est toujours lancé ou tu as fermé la fenêtre?


[Edit]
Ha mais attend, à aucun moment tu ne dis que tu arrives a te logger? Tu dis juste que la connection au site se passe bien. Donc si tu n'arrives pas a te logger essai comme ça

Code :
Set DOCelement = IEdoc.getElementsByName("user").Item(0)
getElementsByName te renvoie un tableau d'éléments, il faut donc préciser celui sur lequel tu veux travailler.
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 08h20   #6
Futur Membre du Club
 
Inscription : novembre 2007
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 71
Points : 17
Points : 17
Salut,

Quand je dis que la connexion au site se passe bien je voulais dire j'arrive à m'identifier.

Avec tes conseils je suis reparti d'un classeur tout neuf et j'ai libéré les objets. Maintenant plus d'erreur .

Maintenant que je suis logué je dois aller à une page précise le mieux c'est de garder mon élément ie déjà créé et d'utiliser le code suivant ?

Code :
1
2
 
ie.Navigate ("http://www.page.suivante.php")
L'identification dure aussi un petit bout de temps entre mon submit et la page acceuil j'ai reproduit la même attente qu'au début c'est propre ?

Code :
1
2
3
4
 
Do Until ie.ReadyState = 4
        DoEvents
Loop
Ou il vaut mieux que je fasse un wait ?

Désolé je débute et j'ai besoin de conseille de "propreté de code" pour partir du bon pied
baime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 17h47   #7
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
SAlut

Oui tu peux garder le même IE, le site doit créer un cookie certainement.

Pour le coté propre, lorsque j'utilise IE pour l'attente de chargement j'utilise le même code d'attente, par contre pour alléger le code je le met dans un function à part.

Comme ça

Code :
1
2
3
4
5
6
Sub WaitIE(IE As InternetExplorer)
'On boucle tant que la page n'est pas totalement chargé
Do Until IE.ReadyState = READYSTATE_COMPLETE 'ou = 4 si tu n'as pas activé les Références IE
    DoEvents
Loop
End Sub
Tu places ce code dans un module standard

Par la suite à chaque fois que tu as besoin d'attendre un chargement tu fais appelle à la function WaitIE

Comme ça

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sub connexion()
 
    Dim ie As InternetExplorer
    Dim IEdoc As Object
    Dim DOCelement As Object
 
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.Navigate ("http://www.xxxxx.org")
 
    ' attente de fin de chargement
    WaitIE IE
 
    Set IEdoc = ie.Document
 
    'login
     Set DOCelement = IEdoc.getElementsByName("vb_login_username").Item
     DOCelement.Value = "login"
 
    'password
     Set DOCelement = IEdoc.getElementsByName("vb_login_password").Item
     DOCelement.Value = "password"
 
    'connexion
     Set DOCelement = IEdoc.Forms(0)
     DOCelement.submit
 
     'On attend
     WaitIE IE
 
End Sub
L'avantage, c'est que si tu manipules plusieurs instances d'IE, tu as juste à préciser quel instance tu attends.

Coté pratique, essais de mettre toujours au moins une majuscule dans tes noms de variables, comme ça quand tu tapes ton code, si tu ne vois pas de majuscule dans ta variable, c'est que tu l'as mal orthographié ( dim IE... au lieu de Dim ie...).

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/10/2011, 09h17   #8
Futur Membre du Club
 
Inscription : novembre 2007
Messages : 71
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 71
Points : 17
Points : 17
Super merci pour tes infos

Maintenant il va falloir que je m'attaque à la récupération d'un tableau parmi plusieurs dans la page HTML.

Je vais être obligé de décortiquer le code ligne par ligne je pense
baime est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h18.


 
 
 
 
Partenaires

Hébergement Web