Navigation Internet

Bonjour à tous,

Je début en navigation internet avec Excel.

J'ai récupéré ce bout de code sur internet, mais il y a une erreur d'exécution 13 sur la ligne :

Set InputGoogleBouton = IEDoc.all("btnK")

Voici le code entier, rangé dans un module excel :

Option Explicit

Sub RechercheVBAExcel()
'Inscrire du texte dans une zone de texte ex: zone de recherche google
'*********************************************************************

'Déclaration de variables

'Dim IE As New InternetExplorer 'en référencant
Dim IE As Object 'en Late Binding
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement
Dim InputGoogleBouton As HTMLInputElement
Dim SelectGoogleBouton As HTMLSelectElement

    Set IE = CreateObject("internetexplorer.application") 'en Late Binding

    'Chargement d'une page Web
    IE.navigate "https://www.google.fr/"

    'Affichage de la fenêtre IE
    IE.Visible = True

    'Attente chargement
    WaitIE IE

    'on pointe le membre du document
    Set IEDoc = IE.document
        WaitDoc IEDoc

    'on pointe notre zone de texte
    Set InputGoogleZoneTexte = IEDoc.all("q")

    'on définit le texte que l'on veut saisir dans zone de rech
    InputGoogleZoneTexte.Value = "VBA Excel"
    InputGoogleZoneTexte.FireEvent "OnPaste"
    'on pointe le bouton rech
    Set InputGoogleBouton = IEDoc.all("btnK")

    ' on simule un clic
    SelectGoogleBouton.Click

    'Attente la fin de chargement
    WaitIE IE
    WaitDoc IEDoc

    'libération de la variable
    Set IE = Nothing
    Set IEDoc = Nothing

    'Permet de quitter la page web
    'IE.Quit

End Sub
Sub WaitIE(IE As InternetExplorer)
'Boucle tant que la page n'est pas totalement chargée
'****************************************************
    Do Until IE.readyState = READYSTATE_COMPLETE And (Not IE.Busy)
        DoEvents
    Loop

End Sub
Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub

pouvez-vous m'aider s'il vous plait ?

Cordialement,

Bonjour à tous,

Je me permets de revenir vers vous, pouvez-vous m'aider sur ce sujet ?

J'espère que c'est la bonne section du forum..

Merci d'avance,

Romain.

Bonjour,

Je suppose que le code vient d'ici https://forum.excel-pratique.com/viewtopic.php?t=57501

J'ai testé mais en effet j'ai aussi des erreurs, et pas que celle mentionnée

Bref, je pense simplement que le site a évolué, pourtant je trouve bien btnk dans le code source

capture d ecran 14

Que souhaites-tu faire ? car il y a plus simple ... il suffit de mettre les termes recherchés dans l'url :

https://www.google.fr/search?&q=forum+excel+pratique

Si tu ne trouves pas le bouton, tu peux utiliser sendkeys pour simuler la tabulation et la touche entrée

    SendKeys "{TAB}", True
    SendKeys "{ENTER}", True

Bonsoir et merci pour tes réponses.

Le but est simplement de me familiariser un peu avec des bases.

Apres avoir acquis ces quelques bases, le but et de pouvoir piloter un site intranet (site du boulot) automatiquement via un fichier Excel (...)

Pour autant, je ne comprends pas pourquoi cette méthode ne marche plus.. Elle était pourtant si claire pour moi.

Effectivement, je peux utiliser d'autre méthodes, celles que tu me présentes et que j'avais déjà testé.

Mais comme le but étant d'apprendre les bases, je ne comprenais pas le fonctionnement.

En espérant que sur l'intranet, cela fonctionne mieux.. Bizard.

Merci,

OK, alors bon courage pour la suite (j'ai fait différentes tentatives, je n'ai pas réussi ... peut-être Pierre56 qui est un grand spécialiste !). Et essaye sur des sites plus simples, y compris ton intranet, car le code source de google est particulièrement complexe !!

Parfait.

En tout cas, merci pour tes réponses.

Je pensais que Google était le plus simple.. Une simple recherche à réaliser via Excel.

Oui si un spécialiste a une réponse, ça permet d'éclaircir un point..

Merci, Bonne soirée,

Après réflexion ... le problème vient de ce que InputGoogleBouton ne serait pas un HTMLInputElement.

Change en Dim InputGoogleBouton As Object et la ligne n'est plus en défaut ... cela reste curieux d'autant que l'essai qui suit démontre l'inverse.

Le second problème est que SelectGoogleBouton n'est pas défini ... je pense que tu voulais mettre InputGoogleBouton mais par contre il n'accepte pas le click dessus.

Autre variante est d'utiliser submit avec la form tsf :

Option Explicit

Sub RechercheVBAExcel()
'Inscrire du texte dans une zone de texte ex: zone de recherche google
'*********************************************************************

'Déclaration de variables

'Dim IE As New InternetExplorer 'en référencant
Dim IE As Object 'en Late Binding
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement
Dim FormGoogle As HTMLFormElement
Dim SelectGoogleBouton As HTMLSelectElement

    Set IE = CreateObject("internetexplorer.application") 'en Late Binding

    'Chargement d'une page Web
    IE.navigate "https://www.google.fr/"

    'Affichage de la fenêtre IE
    IE.Visible = True

    'Attente chargement
    WaitIE IE

    'on pointe le membre du document
    Set IEDoc = IE.Document
        WaitDoc IEDoc

    'on pointe notre zone de texte
    Set InputGoogleZoneTexte = IEDoc.all("q")

    'on définit le texte que l'on veut saisir dans zone de rech
    InputGoogleZoneTexte.Value = "VBA Excel"
    InputGoogleZoneTexte.FireEvent "OnPaste"

    Set FormGoogle = IEDoc.all("tsf")
    FormGoogle.submit

    'Attente la fin de chargement
    WaitIE IE
    WaitDoc IEDoc

    'libération de la variable
    Set IE = Nothing
    Set IEDoc = Nothing

    'Permet de quitter la page web
    'IE.Quit

End Sub
Sub WaitIE(IE As InternetExplorer)
'Boucle tant que la page n'est pas totalement chargée
'****************************************************
    Do Until IE.readyState = READYSTATE_COMPLETE And (Not IE.Busy)
        DoEvents
    Loop

End Sub
Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub

Autre solution avec click : balayer tout le document !!

Dim MyHTML_Element As HTMLElementCollection

'...

    For Each MyHTML_Element In IEDoc.getElementsByTagName("input")
        If MyHTML_Element.Type = "submit" Then
            Debug.Print MyHTML_Element.Name
            MyHTML_Element.Click
            Exit For
        End If
    Next

donc fondamentalement, ton code est bon car il indique bien dans le debugger le nom btnK !!! et a minima cela te montre qu'en effet le click fonctionne ...

capture d ecran 15

Voici le fin mot de l'affaire ... si je fais

Dim MyHTML_Element As HTMLElementCollection
' ...
    For Each MyHTML_Element In IEDoc.getElementsByTagName("input")
        Debug.Print MyHTML_Element.Name & " >>> " & MyHTML_Element.Type
    Next

J'obtiens :

source >>> hidden
ei >>> hidden
q >>> text
btnK >>> submit
btnI >>> submit
btnK >>> submit
btnI >>> submit

Google a donc doublé les boutons et donc le fameux IEDoc.all("btnK") n'est en effet pas un HTMLInputElement mais un tableau d'HTMLInputElement !!!

Il suffit donc d'en prendre le premier (ou second) élément pour cliquer dessus ! CQFD ...

La correction est donc :

    'on pointe le bouton rech
    Set InputGoogleBouton = IEDoc.all("btnK")(0)

    ' on simule un clic
    InputGoogleBouton.Click

comme quoi jouer avec les sites google est assez pointu ... ils ont été assez malins en doublant ces boutons submit pour nous prendre en défaut.

Salut tout le monde,

un essai

Option Explicit

Sub RechercheVBAExcel()
'Inscrire du texte dans une zone de texte ex: zone de recherche google
'*********************************************************************

'Déclaration de variables

'Dim IE As New InternetExplorer 'en référencant
Dim IE As Object 'en Late Binding
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement

    Set IE = CreateObject("internetexplorer.application") 'en Late Binding

    'Chargement d'une page Web
    IE.navigate "https://www.google.fr/"

    'Affichage de la fenêtre IE
    IE.Visible = True

    'Attente chargement
    WaitIE IE

    'on pointe le membre du document
    Set IEDoc = IE.document
        WaitDoc IEDoc

    'on pointe notre zone de texte
    Set InputGoogleZoneTexte = IEDoc.all("q")

    'on définit le texte que l'on veut saisir dans zone de rech
    InputGoogleZoneTexte.Value = "VBA Excel"
    InputGoogleZoneTexte.FireEvent "OnPaste"

    'Attente la fin de chargement
    WaitDoc IEDoc
    WaitIE IE

    IE.Visible = True
    Application.SendKeys "{TAB}"
    Application.SendKeys "~"

    'libération de la variable
    Set IE = Nothing
    Set IEDoc = Nothing

    'Permet de quitter la page web
    'IE.Quit

End Sub
Sub WaitIE(IE As InternetExplorer)
'Boucle tant que la page n'est pas totalement chargée
'****************************************************
    Do Until IE.readyState = READYSTATE_COMPLETE And (Not IE.Busy)
        DoEvents
    Loop

End Sub
Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub

voici une methode plus simple à relier à un boutton

Option Explicit

Private Sub CommandButton1_Click()
Dim IE As InternetExplorer
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate ("http://www.google.com")

Do
DoEvents
Loop Until IE.readyState = 4

IE.document.all("q").Value = "VBA Excel"
SendKeys "{ENTER}"

Do
DoEvents
Loop Until IE.readyState = 4
End Sub

Bonjour m3ellem1

C'est effectivement la solution que j'avais proposée ici aussi https://forum.excel-pratique.com/viewtopic.php?p=790868#p790868

Mais en fait Tchio77 voulait surtout expérimenter les relations entre VBA et internet et sa question était tout à fait pertinente : pourquoi il n'était pas possible de cliquer sur le bouton ... sauf que le malin google avait caché ce bouton dans un tableau puisqu'il l'avait dupliqué https://forum.excel-pratique.com/viewtopic.php?p=790908#p790908. Moi cela me rassure aussi car cette affaire était vraiment curieuse ! J'en perdais mon latin.

Mais tes solutions sont tout à fait opérationnelles et plus rapides que chercher dans le DOM du site les noms des objets.

Bonjour à tous,

Waouh, Steelson tu dors de temps en temps ?

Merci à tous pour vos réponses.

Je ne suis pas certain d'avoir tous compris (normal, je débute..), mais j'ai essayé.

Voici le code posé dans un module :

Option Explicit

Sub RechercheVBAExcel()
'Inscrire du texte dans une zone de texte ex: zone de recherche google
'*********************************************************************

'Déclaration de variables

'Dim IE As New InternetExplorer 'en référencant
Dim IE As Object 'en Late Binding
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement
Dim InputGoogleBouton As HTMLInputElement

    Set IE = CreateObject("internetexplorer.application") 'en Late Binding

    'Chargement d'une page Web
    IE.navigate "https://www.google.fr/"

    'Affichage de la fenêtre IE
    IE.Visible = True

    'Attente chargement
    WaitIE IE

    'on pointe le membre du document
    Set IEDoc = IE.document
        WaitDoc IEDoc

    'on pointe notre zone de texte
    Set InputGoogleZoneTexte = IEDoc.all("q")

    'on définit le texte que l'on veut saisir dans zone de rech
    InputGoogleZoneTexte.Value = "VBA Excel"
    InputGoogleZoneTexte.FireEvent "OnPaste"
    'on pointe le bouton rech
    Set InputGoogleBouton = IEDoc.all("btnK")(0)

    ' on simule un clic
    SelectGoogleBouton.Click

    'Attente la fin de chargement
    WaitIE IE
    WaitDoc IEDoc

    'libération de la variable
    Set IE = Nothing
    Set IEDoc = Nothing

    'Permet de quitter la page web
    'IE.Quit

End Sub
Sub WaitIE(IE As InternetExplorer)
'Boucle tant que la page n'est pas totalement chargée
'****************************************************
    Do Until IE.readyState = READYSTATE_COMPLETE And (Not IE.Busy)
        DoEvents
    Loop

End Sub
Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub

J'obtiens une erreur de compilation, type défini par l'utilisateur.

Bizard, j'ai même essayé les différents code que vous m'avez fourni dans vos messages..

Je dois donc oublier de déclarer une variable.

Peux-tu me dire à quoi sert ce code :

Dim MyHTML_Element As HTMLElementCollection
' ...
    For Each MyHTML_Element In IEDoc.getElementsByTagName("input")
        Debug.Print MyHTML_Element.Name & " >>> " & MyHTML_Element.Type
    Next

Merci pour vos réponses,

Waouh, Steelson tu dors de temps en temps ?

cela m'arrive ... 4h par nuit puis ensuite une pause la matin et le midi !


J'obtiens une erreur de compilation, type défini par l'utilisateur.

Bizard, j'ai même essayé les différents code que vous m'avez fourni dans vos messages..

Je dois donc oublier de déclarer une variable.

non ce n'est pas une variable, mais des références ... et je ne sais jamais lesquelles, mieux vaut dans ce cas partir d'un fichier qui a activé les références et fonctionne (comme le pot de yaourt ou le pain au levain).

capture d ecran 22

et puis ...

    ' on simule un clic
    SelectGoogleBouton.Click

à remplacer par ...

    ' on simule un clic
    InputGoogleBouton.Click

car SelectGoogleBouton n'est défini nulle part !


Peux-tu me dire à quoi sert ce code :

Dim MyHTML_Element As HTMLElementCollection
' ...
    For Each MyHTML_Element In IEDoc.getElementsByTagName("input")
        Debug.Print MyHTML_Element.Name & " >>> " & MyHTML_Element.Type
    Next

L'objet de ce code était de rechercher tous les input, et de les afficher dans la fenêtre exécution de VBE (voir photo ci-dessus) ... ce qui a permis de confirmer qu'il y avait 2 boutons du même nom et donc que le fameux IEDoc.all("btnK") renvoyait un tableau et non un HTMLInputElement !

capture d ecran 23
Rechercher des sujets similaires à "navigation internet"