Bonjour,
A quoi sert le
au IV.J ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TheURL = WinHttpReq.responseBody
Il n'est pas utilisé dans le code.
Bonjour,
A quoi sert le
au IV.J ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TheURL = WinHttpReq.responseBody
Il n'est pas utilisé dans le code.
Salut
Sans doute une erreur de ma part lors de l'adaptation de la fonction, j'avoue ne pas me souvenir.
J'ai peut-être fait des essais et cette ligne est resté par oubli.
Essai le code sans elle et si tout fonctionne bien, tout est pour le mieux. A moins qu'elle force une initialisation quelconque je ne vois pas trop ce qu'elle apporte.
Je viens de regarder le lien d'origine, cette ligne est déjà présente.
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et Seul Tutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Bonjour,
Tout d'abord merci pour ce tuto trés instructif...
Il me semble qu'il y ait une petite modif à faire pour récupérer le n° d'évenement
Mais surtout est il possible de m'expliquer pourquoi certaine fois tabVide = Vide et parfois tabVide = -1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 'On récupère le n° de l'évènements ici n° 208 Set htmlGeneric = IEDoc.body.all("event_num") strTmp = htmlGeneric.innerText ' : strTmp : "Evénement n° 208" : String i = InStr(strTmp, " ") i = Len(strTmp) - i strTmp = Trim(Right(strTmp, i))
tabvide = UBound(htmlTabElement) avec UBound(htmlTabElement)<l'indice n'appartient pas à la sélection> n'est pas reconnu de la même façon!!!
en attendant voici la modif que j'ai faite...
car je n'ai pas réussi cela
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 If Not tabvide = Vide Then MsgBox "Le LotoFoot est annulé" Set IE = Nothing Set IEDoc = Nothing IE.Quit Exit Sub End If
...
Code : Sélectionner tout - Visualiser dans une fenêtre à part if not (tabVide= Vide) or (tabVide= -1) then
Merci
Salut
Merci pour ce retour.
Pour ce qui est du numéro d'événement, je ne comprend pas ta remarque, l'événement 208 que tu sites correspond au numéro de l'événement sur lequel tu as travaillé, aujourd'hui c'est le 211, à l'époque de la réalisation du tutoriel le 114, je ne vois donc pas l’intérêt de citer la valeur de ce numéro, mais peut-être que je ne comprend pas ta démarche.
Pour la valeur de TabVidessai de noté le contenu de htmlTabElement lorsque tu as la valeur "Vide" dans TabVide, pour moi UBound renvoi toujours une valeur numérique, "vide" ne correspond à rien pour moi en VBA, que représente-t-il pour toi? Est ce une variable ou une constante que tu initialises au début de ton code? A moins que tu ne parle de Empty?
Voila le tutoriel écrit par Silkyroad concernant les tableaux, il y a de forte chance que je me soit inspiré de son code pour tester si ma variable tableau était vide ou non, par contre lui utilise IsEmpty au lieu d'une comparaison à -1.
Je me demande si la Base utilisé ne jouerait pas un rôle... Désolé, ça ne me vient pas, je te donne une solution en fin de message pour me faire pardonner
Je profite de ce poste pour signaler qu'une fonction GetElementByClassName existe dans l'objet HTMLDocument (IEDoc) entre autre... Pour ceux qui se demande pourquoi à l'époque j'ai créé ma propre fonction, je n'en sais rien, soit je suis passé à coté de cette méthode, soit elle n'existait pas dans la version que j'utilisais (j'ai la flemme de vérifier ).
Toujours est-il qu'une méthode existe et qu'elle sera certainement plus performante que la mienne ! :p.
Voila ce que donnerait le code en l'utilisant (attention au changement de type lors de la déclaration de htmlTabElement)
++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 '#### Match annulé? #### Dim htmlTabElement As IHTMLElementCollection 'On vérifie l'absence du ClassName d'élément "lotofoot_indispo" Set htmlTabElement = IEDoc.getElementsByClassName("lotofoot_indispo") If htmlTabElement.Length <> 0 Then MsgBox "Le LotoFoot est annulé" Exit Sub End If
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et Seul Tutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
bonjour
Une autre alternative pour recupérer le code source d'une page
regarde dans mes contribution (((C'EST ICI)))
Au plaisir
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Bonjour Qwazerty
Tout d'abord un grand merci sur votre super Tuto, Interaction avec Internet Explorer via VBA Excel, que j'ai lu en long en large avec beaucoup d'intérêt et qui m'a apporté beaucoup de solutions.
Je suis un bleu en VBA Excel, et je met les mains dedans pour un fichier d’analyse de course hippique que je suis en train de créer grâce au super outils Excel, néanmoins j'ai beaucoup d'information Internet à saisir d'où mon intérêt de macro pour exécuter ces importations.
Au tout début pour ce faire, je me suis servi de macro simple grâce à l'importation de données à partir du web, jusqu'au moment ou cette solution ne pouvais plus être envisageable car les données que je devais importé sont sur une page avec identification.
Du coup je suis tombé sur votre formidable Tuto qui m'a permis de me loggé et et importé mes données.
Néanmoins je me trouve bloqué sur un problème que je n'arrive pas à résoudre malgré beaucoup de persévérance.
En fait pour faire simple j'ai une feuille excel ou se trouve X courses avec leur liens.
Ma macro doit aller récupérer chaque lien et sur ces chaque liens elle doit importer le pronostic de cette course dont je ne connaît par avance le nombre de cheval et doit écrire ce pronostic sur chaque feuille dont elle dépend (1 feuille pour une course), mes feuilles sont nommées 1,2,3,4,etc ..
Mon problème la Boucle For Each me pose problème car elle garde comptabilisée la course précédente et du coup s’arrête prématurément avant la fin de toutes les courses avec une belle erreur d'execution '9' ( L'indice n’appartient pas à la sélection) , ce qui est tout à fait compréhensible puisque la boucle For Each est vide !
C'est difficile a expliquer avec exactitude du coup je joint le fichier .
Et je met le code :
Ce fichier contient deux boutons pour déclencher les macros, un avec For Each qui Bug à partir de l'ouverture de la 2 ème courses et l'autre avec boucle For To ... Une parade que j'ai trouvé et qui fonctionne grâce encore à votre Tuto et l'expression (On Error Resume Next) pour passer au delà de l'erreur que vous comprendrez tout de suite en regardant le code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Sub Pronostic_Geny_course1() 'Methode qui ne fonctionne pas avec For Each Dim IE As New InternetExplorer Dim IEDoc As HTMLDocument 'Nombres de courses de la journée nb_courses = Sheets("Courses").Range("A1").Value 'Boucle pour toutel courses et donc de même les pages des courses For Course = 2 To nb_courses 'Url Détail course de Geny Curl = Sheets("Courses").Range("B" & Course) 'On ouvre la page Web IE.Navigate Curl IE.Visible = True Do Until IE.ReadyState = READYSTATE_COMPLETE DoEvents Loop Set IEDoc = IE.document Dim Pronostic As HTMLGenericElement Dim FavPronos As HTMLGenericElement Dim Test As Variant Dim Pronos() As IHTMLElement Set Pronostic = IEDoc.getElementById("prono_cnt") Set FavPronos = Pronostic.all(9) 'item 9 est = à item 9+1=10 de la class yui-u first Pronos = getElementsByClassName(FavPronos, "num", False) For Each Test In Pronos Ligne = Ligne + 1 NCh = NCh + 1 Sheets("" & Course - 1).Range("B1") = "Pronostics" Sheets("" & Course - 1).Cells(1 + Ligne, "B").Value = Pronos(NCh - 1).innerText Next Next Course End Sub
Je vous remercie d'avance pour une réponse .
Bonjour Qwazerty,
Permettez-moi d'abonder dans le sens des autres lecteurs: Bravo pour ce tutoriel. Bien qu'un peu dur à digérer un dimanche matin.
J'ai trouvé sur le net les deux sites suivants
https://code.google.com/p/ff-activex-host/
https://code.google.com/p/np-activex/
Ils sont peut-être un début de solution au problème posé
Harry
Bonjour Qwazerty
Merci pour ton commentaire, désolé de répondre si tardivement mais avant de te resolliciter j'ai fais des tests sur ta sub et sur une autre car le probléme semble identique!!!
en rouge sont les remarques demandées...
le n° d'événement n'a pas d'importance...
sinon voici à quoi ressemble le tabvide en variable locale lorsqu'il ne marche pas (c'est comme si le tabvide n'était pas initialisé...mais cela ne se produit pas en F8 semble t'il(en démarche pas à pas ) ni même parfois en F5 si point d'arrêt avant dans la marge!!!
: tabvide : Vide : Variant/Empty
avec
: htmlTabElement : : IHTMLElement()
en cliquant sur le + : : <Aucune variable> : et donc
UBound(htmlTabElement)=<l'indice n'appartient pas à la sélection>
Peut être ne reconnait il pas funcElement à chaque fois...soit le tableau array??
la même situation d'erreur se produit dans une autre sub suivant si F8 ou F5 servent à lancer la sub...de la même manière...
Peut être faut il simuler un point d'arrêt avant ou un sleep (je ne sais pas trop trop) j'ai essayé
sleep 100 aprés avoir mis
ca n'a rien changé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
voici le code où l'erreur se produit:
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set tabledata = htmlTagCol.Item(k)où
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim tabledata As HTMLTableet avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set htmlTagCol = IEDoc.getElementsByTagName("table")(parcours des différentes tables de la page web et choix de la table k en fonction de mot = htmlTagCol.Item(k).innerText
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim htmlTagCol As IHTMLElementCollection
parfois tabledata est bien intialisée et parfois non alors que c'est toujours la même table qui est lue!!! (erreur du même style que tabvide = -1 parfois et tabvide = vide parfois)
Ca m'aiderai bien si une explication permettait d'éviter cette erreur ou tout du moins si cette erreur pouvait être contournée...
PS: je vais regarder la facon de charger une table comme indiquée dans ton poste...
Bonjour à tous,
Je l'ai déjà mentionné dans de nombreuses discussion mais il me paraît utile de le dire ici.
Même quand IE a terminé, il se peut que le Document (le contenu de la page) n'ait pas fini de se charger.
Après chaque changement de page, il faut répéter la structure suivante:
avec les 2 procédures d'attente:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3WaitIE IE Set IEDoc = IE.document WaitDoc IEDoc
Testé et retesté dans de nombreux contextes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub WaitIE(IE As InternetExplorer) Do While Not IE.readyState = READYSTATE_COMPLETE DoEvents Loop End Sub Sub WaitDoc(doc As HTMLDocument) Do While Not doc.readyState = "complete" DoEvents Loop End Sub
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Merci pour l'info. Pour l'instant ça a l'air de marcher mais je n'ai pas fait de test de robustesse (avec une mauvaise connexion internet).
Autre sujet : Est-il possible par le code visual basic d'ouvrir un autre navigateur que IE pour travailler sur le Web ?
Salut
Arff, désolé pour le manque de suivi... je n'ai pas été alerté des nouveaux messages...
Visiblement AlainTech à fourni pile poile ce qu'il faut, merci bien je ne connaissais pas cette méthode.
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et Seul Tutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Bonjour à tous,
Pour ceux qui reçoivent l'erreur (à partir de IE8)
et, en debug, dans la fenêtre des variables locale ou des espionsErreur Automation : L'objet invoqué s'est déconnecté de ses clients
il y a 2 options:Automation errorThe interface is unknown
- Early binding
Remplacer
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set objIE = New InternetExplorer
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set objIE = New InternetExplorerMedium- Late binding
Remplacer
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set objIE = CreateObject("InternetExplorer.Application")
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Salut
Cool, merci pour ces astuces.
La clé "D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E" ne peut jamais varier dans la base de registre?
J'ai regardé et en effet dans ma base de registre elle correspond bien à iexplorer, mais est-ce bien toujours le cas?
Merci.
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et Seul Tutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Bonjour,
Chez moi je suis toujours sous Win XP et, de ce fait, je ne peux pas faire d'upgrade de IE au delà de la version 8. Chez moi donc cette clef correspond à
ce qui semble bien être le but.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "%ProgramFiles%\Internet Explorer\iexplore.exe" -startmediumtab
En tout cas, ce code m'a sauvé au boulot où on vient de migrer vers Windows 7 et un IE plus récent.
Les codes anciens perdaient le lien vers IE dès le .Navigate.
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Salut
C'est parfait ça, j'avais des soucis au taff avec ça aussi, je testerai dès que j'ai un moment.
Encore merci et je te souhaite de bonnes fêtes de fin d'année, bonnes fêtes à tous
++
Qwaz
MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
Ma page perso DVP
Dernier et Seul Tutoriel : VBA & Internet Explorer
Dernière contribution : Lien Tableau Structuré et UserForm
L'utilisation de l’éditeur de message
Bonjour,
Suite à la demande de itwoo à propos d'un Frame, voici ce que j'ai pu retrouver dans mes archives:
Dans mon cas, la frame avait pour nom "page".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Dim objFrame As HTMLIFrame Set objDoc = objIE.document Do While Not objDoc.readyState = "complete" DoEvents Loop Set objFrame = objDoc.getElementsByName("page")(0) Do While Not objFrame.readyState = "complete" DoEvents Loop
Un objet Frame a une propriété readyState comme un Document.
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Bonjour,
Euh, c'était quoi la question de itwoo ?
De mon côté, je n'ai toujours pas de solution au pb de l'attente du chargement d'une page Web (hormis la technique du sleep qui n'est pas très robuste)
J'ai essayé le WaitIE, le WaitDoc évoqués plus haut.
Ca ne résout pas totalement la question.
Bonjour,
Il s'agissait de l'attente du remplissage d'une partie de la page qui est, en fait, un Frame.
Il est possible de contrôler le ReadyState d'un Frame tout comme pour IE et le Document.
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Merci à AlainTech pour la résolution du problème (à partir de IE8)
"Erreur Automation : L'objet invoqué s'est déconnecté de ses clients"
En suivant ses recommandations mon problème a disparu...
Bonjour
Ne serait-il pas possible de contourner le problème? Existe-t-il une commande VBA pour faire une action similaire à Crtl+A Ctrl+C sous internet explorer. Si c'est le cas on peut s'en servir pour copier collé le contenus d'une page web dans une feuille excel et après le retravailler avec une macro.
Cordialement
Fabian
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager