Microsoft 365 VBA : copier les adresses

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Je suis sur Windows 11, j'ai trouvé un code (un peu compliqué pour moi) pour copier les adresses url, mais malheureusement je reçois un bug et je ne trouve pas comment le résoudre. Pourriez vous m'aider ?

Voici le code :
VB:
Option Explicit
Const TargetItemsQty = 1 ' results for each keyword

Sub GWebSearchIECtl()

    Dim objSheet As Worksheet
    Dim objIE As Object
    Dim x As Long
    Dim y As Long
    Dim strSearch As String
    Dim lngFound As Long
    Dim st As String
    Dim colGItems As Object
    Dim varGItem As Variant
    Dim strHLink As String
    Dim strDescr As String
    Dim strNextURL As String

    Set objSheet = Sheets("Sheet1")
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True ' for debug or captcha request cases
    y = 1 ' start searching for the keyword in the first row
    With objSheet
        .Select
        .Range(.Columns("B:B"), .Columns("B:B").End(xlToRight)).Delete ' clear previous results
        .Range(.Columns("C:C"), .Columns("C:C").End(xlToRight)).Delete ' clear previous results
        .Range("A1").Select
        Do Until .Cells(y, 1) = ""
            x = 2 ' start writing results from column B
            .Cells(y, 1).Select
            strSearch = .Cells(y, 1) ' current keyword
            With objIE
                lngFound = 0
                .navigate "https://www.google.com/search?q=" & EncodeUriComponent(strSearch) ' go to first search results page
                Do
                    Do While .Busy Or Not .READYSTATE = 4: DoEvents: Loop ' wait IE
                    Do Until .document.READYSTATE = "complete": DoEvents: Loop ' wait document
                    Do While TypeName(.document.getelementbyid("res")) = "Null": DoEvents: Loop ' wait [#res] element
                    Set colGItems = .document.getelementbyid("res").getElementsByClassName("g") ' collection of search result [.g] items
                    For Each varGItem In colGItems ' process each item in collection
                        If varGItem.getelementsbytagname("a").Length > 0 And varGItem.getElementsByClassName("st").Length > 0 Then ' must have hyperlink and description
                            strHLink = varGItem.getelementsbytagname("a")(0).href ' get first hyperlink [a] found in current item
                            strDescr = GetInnerText(varGItem.getElementsByClassName("st")(0).innerHTML) ' get first description [span.st] found in current item
                            lngFound = lngFound + 1
                            'Debug.Print (strHLink)
                            'Debug.Print (strDescr)
                            With objSheet ' put result into cell
                                 .Cells(y, x).Value = strDescr
                                 .Hyperlinks.Add .Cells(y, x + 1), strHLink
                                .Cells(y, x).WrapText = True
                                x = x + 1 ' next column
                            End With
                            If lngFound = TargetItemsQty Then Exit Do ' continue with next keyword - necessary quantity of the results for current keyword found
                        End If
                        DoEvents
                    Next
                    If TypeName(.document.getelementbyid("pnnext")) = "Null" Then Exit Do ' continue with next keyword - no [a#pnnext.pn] next page button exists
                    strNextURL = .document.getelementbyid("pnnext").href ' get next page url
                    .navigate strNextURL ' go to next search results page
                Loop
            End With
            y = y + 1 ' next row
        Loop
    End With
    objIE.Quit

    ' google web search page contains the elements:
    ' [div#res] - main search results block
    ' [div.g] - each result item block within [div#res]
    ' [a] - hyperlink ancor(s) within each [div.g]
    ' [span.st] - description(s) within each [div.g]
    ' [a#pnnext.pn] - hyperlink ancor to the next search results page

End Sub

Function EncodeUriComponent(strText As String) As String
    Static objHtmlfile As Object

    If objHtmlfile Is Nothing Then
        Set objHtmlfile = CreateObject("htmlfile")
        objHtmlfile.parentWindow.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
    End If
    EncodeUriComponent = objHtmlfile.parentWindow.encode(strText)
End Function

Function GetInnerText(strText As String) As String
    Static objHtmlfile As Object

    If objHtmlfile Is Nothing Then
        Set objHtmlfile = CreateObject("htmlfile")
        objHtmlfile.Open
        objHtmlfile.Write "<body></body>"
    End If
    objHtmlfile.body.innerHTML = strText
    GetInnerText = objHtmlfile.body.innerText
End Function

Le bug qui survient :
1746990854199.png



1746990880945.png


Voici l'adresse de discussion où j'ai trouvé le code : https://stackoverflow.com/questions/60653046/return-url-from-first-search-result

Merci beaucoup pour votre aide !
 
Bonjour,
Je ne sais pas trop ce que vous attendez du code fourni qui est "obsolète" car on n'utilise plus "InternetExplorer.Application" abandonné par Microsoft et la ressource "Res" qui n'est plus fourni par Google Search .

Si vous voulez récupérer les liens sur la première page de résultat de Google Search pour un terme,
Voyez le classeur joint si cela peut vous servir ( adapté à google Search à ce jour )
 

Pièces jointes

Bonjour,
Je ne sais pas trop ce que vous attendez du code fourni qui est "obsolète" car on n'utilise plus "InternetExplorer.Application" abandonné par Microsoft et la ressource "Res" qui n'est plus fourni par Google Search .

Si vous voulez récupérer les liens sur la première page de résultat de Google Search pour un terme,
Voyez le classeur joint si cela peut vous servir ( adapté à google Search à ce jour )
Bonjour Fanch55,

Merci pour les explications. Quant je teste le code je reçois le message "Fini" sans aucune adresse. En fait, le site Google ne se lance pas, alors qu'il s'est lancé avec le premier code.
 
Réaction aléatoire et bizarre de Google .
Essayez de vous connecter, il y a un bouton exprès pour cela
Regarde la pièce jointe 1217900
Regarde la pièce jointe 1217902
Merci, Fanch55 ! Malheureusement je reçois cette erreur :
1747473262997.png

1747473342662.png

J'essaye de la corriger avec ce code, mais pour l'instant je n'arrive pas :
VB:
Fonction publique GetHTTP (URL ByVal sous forme de chaîne) sous forme de chaîne
    En cas d'erreur, reprendre ensuite
    Avec CreateObject("WinHttp.WinHttpRequest.5.1")
        .Ouvrez "GET", URL, Faux
        .Envoyer
        GetHTTP = .ResponseText
    Terminer par
Fonction de fin
 
Evitez d'utiliser WinHttp.WinHttpRequest.5.1 , il va vous demander d'autoriser les cookies systématiquement .

Correction du classeur en précisant un agent de navigation , mais je pense que vous n'êtes pas autorisée à envoyer des requêtes sur le réseau .
Le problème survient il également chez vous ?
 

Pièces jointes

Evitez d'utiliser WinHttp.WinHttpRequest.5.1 , il va vous demander d'autoriser les cookies systématiquement .

Correction du classeur en précisant un agent de navigation , mais je pense que vous n'êtes pas autorisée à envoyer des requêtes sur le réseau .
Le problème survient il également chez vous ?
Merci, Fanch55 !
C'est noté. Maintenant la connexion fonctionne mais le code ne retrouve pas l'adresse. Dois-je ajouter un outil dans Références ?
1747486728393.png
 
Bonjour,

Je suis sur Windows 11, j'ai trouvé un code (un peu compliqué pour moi) pour copier les adresses url, mais malheureusement je reçois un bug et je ne trouve pas comment le résoudre. Pourriez vous m'aider ?

Voici le code :
VB:
Option Explicit
Const TargetItemsQty = 1 ' results for each keyword

Sub GWebSearchIECtl()

    Dim objSheet As Worksheet
    Dim objIE As Object
    Dim x As Long
    Dim y As Long
    Dim strSearch As String
    Dim lngFound As Long
    Dim st As String
    Dim colGItems As Object
    Dim varGItem As Variant
    Dim strHLink As String
    Dim strDescr As String
    Dim strNextURL As String

    Set objSheet = Sheets("Sheet1")
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True ' for debug or captcha request cases
    y = 1 ' start searching for the keyword in the first row
    With objSheet
        .Select
        .Range(.Columns("B:B"), .Columns("B:B").End(xlToRight)).Delete ' clear previous results
        .Range(.Columns("C:C"), .Columns("C:C").End(xlToRight)).Delete ' clear previous results
        .Range("A1").Select
        Do Until .Cells(y, 1) = ""
            x = 2 ' start writing results from column B
            .Cells(y, 1).Select
            strSearch = .Cells(y, 1) ' current keyword
            With objIE
                lngFound = 0
                .navigate "https://www.google.com/search?q=" & EncodeUriComponent(strSearch) ' go to first search results page
                Do
                    Do While .Busy Or Not .READYSTATE = 4: DoEvents: Loop ' wait IE
                    Do Until .document.READYSTATE = "complete": DoEvents: Loop ' wait document
                    Do While TypeName(.document.getelementbyid("res")) = "Null": DoEvents: Loop ' wait [#res] element
                    Set colGItems = .document.getelementbyid("res").getElementsByClassName("g") ' collection of search result [.g] items
                    For Each varGItem In colGItems ' process each item in collection
                        If varGItem.getelementsbytagname("a").Length > 0 And varGItem.getElementsByClassName("st").Length > 0 Then ' must have hyperlink and description
                            strHLink = varGItem.getelementsbytagname("a")(0).href ' get first hyperlink [a] found in current item
                            strDescr = GetInnerText(varGItem.getElementsByClassName("st")(0).innerHTML) ' get first description [span.st] found in current item
                            lngFound = lngFound + 1
                            'Debug.Print (strHLink)
                            'Debug.Print (strDescr)
                            With objSheet ' put result into cell
                                 .Cells(y, x).Value = strDescr
                                 .Hyperlinks.Add .Cells(y, x + 1), strHLink
                                .Cells(y, x).WrapText = True
                                x = x + 1 ' next column
                            End With
                            If lngFound = TargetItemsQty Then Exit Do ' continue with next keyword - necessary quantity of the results for current keyword found
                        End If
                        DoEvents
                    Next
                    If TypeName(.document.getelementbyid("pnnext")) = "Null" Then Exit Do ' continue with next keyword - no [a#pnnext.pn] next page button exists
                    strNextURL = .document.getelementbyid("pnnext").href ' get next page url
                    .navigate strNextURL ' go to next search results page
                Loop
            End With
            y = y + 1 ' next row
        Loop
    End With
    objIE.Quit

    ' google web search page contains the elements:
    ' [div#res] - main search results block
    ' [div.g] - each result item block within [div#res]
    ' [a] - hyperlink ancor(s) within each [div.g]
    ' [span.st] - description(s) within each [div.g]
    ' [a#pnnext.pn] - hyperlink ancor to the next search results page

End Sub

Function EncodeUriComponent(strText As String) As String
    Static objHtmlfile As Object

    If objHtmlfile Is Nothing Then
        Set objHtmlfile = CreateObject("htmlfile")
        objHtmlfile.parentWindow.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
    End If
    EncodeUriComponent = objHtmlfile.parentWindow.encode(strText)
End Function

Function GetInnerText(strText As String) As String
    Static objHtmlfile As Object

    If objHtmlfile Is Nothing Then
        Set objHtmlfile = CreateObject("htmlfile")
        objHtmlfile.Open
        objHtmlfile.Write "<body></body>"
    End If
    objHtmlfile.body.innerHTML = strText
    GetInnerText = objHtmlfile.body.innerText
End Function

Le bug qui survient :
Regarde la pièce jointe 1217693


Regarde la pièce jointe 1217694

Voici l'adresse de discussion où j'ai trouvé le code : https://stackoverflow.com/questions/60653046/return-url-from-first-search-result

Merci beaucoup pour votre aide !
Existe-t-il un API Google via lequel je pourrais extraire cette information avec une simple formule Excel ?

Merci !
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
386
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
113
Réponses
3
Affichages
560
Réponses
2
Affichages
456
Retour