IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer lien hypertexte du presse-papier en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Invité de passage
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2025
    Messages : 5
    Par défaut Récupérer lien hypertexte du presse-papier en VBA
    Bonjour,

    J'ai dans le presse-papier la copie d'une page internet, donc avec du texte, des images, mais surtout, ce qui m'intéresse, des liens hypertexte.

    Je cherche la solution pour récupérer uniquement les liens hypertexte de ce presse-papier. J'ai fait pas mal de recherches, mais à chaque fois je tombe sur l'instruction Gettext de GetFromClipboard qui me retourne que le texte et aucun le lien.

    Exemple simple :
    Si j'ai copié sur la page internet ceci :
    Cliquer ICI pour accéder au site.

    Si je colle directement le presse-papier sur une feuille Excel, je récupère bien "Cliquer ICI pour accéder au site." dans une cellule mais avec le lien hypertexte sur le mot ICI.
    Par contre, si je place dans une cellule le contenu de Gettext, je n'ai pas ce lien...

    Donc le presse papier a bien mémorisé le lien hypertexte, mais je ne trouve pas de code VBA pour le récupérer.

    Bien sûr, je pourrai d'abord coller le presse-papier directement sur une feuille Excel, puis ensuite rechercher tous les liens sur cette feuille en VBA. Mais le souci, c'est que les pages internet que je colle sont lourdes, il y a beaucoup d'images, et de données. Donc quand je colle directement sous Excel, c'est très long...

    Qui aurait une idée ???

    Merci d'avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 574
    Par défaut
    Hello,

    Manipuler le presse papier en VBA, c'est se battre contre des moulins à vent.

    Lorsque tu colle le contenu du presse papier dans un editeur de texte basique (Notepad par exemple), les liens hypertexte sont-ils visible ?
    Si oui, tu peux les récupérer via une expression régulière:
    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
    Dim clipboard As New MSForms.DataObject
    clipboard.GetFromClipboard
     
    Dim htmlContent As String
    htmlContent = clipboard.GetText
     
    Dim regex As Object, matches As Object, i As Integer
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "href\s*=\s*[""']([^""']+)[""']"
    regex.IgnoreCase = True
    regex.Global = True
     
    Set matches = regex.Execute(htmlContent)
     
    For i = 0 To matches.Count - 1
        Debug.Print matches(i).SubMatches(0)
    Next i
    Dans le cas contraire,
    on peut automatiser le navigateur internet via CDP Framework (et donc se passer du presse papier):
    https://www.developpez.net/forums/d2...r-vba-excel/#3

    Selon la structure de la page web, on peut envisager une solution Power Query.

    Sinon, il faudra se tourner vers d'autres outils capable de faire du web-scraping (Power Automate par exemple).

  3. #3
    Invité de passage
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2025
    Messages : 5
    Par défaut Lien hypertexte dans le presse-papier
    Bonjour Deedolith,

    Merci beaucoup pour ta réponse. J'ai testé. Dans un premier temps, j'avais une erreur sur la 1ère ligne (MSForms.DataObject), car il fallait activer la référence MicrosoftForms 2.0 et elle n'était pas dans la liste, mais en cherchant, j'ai trouvé qu'il fallait ajouter manuellement la MF20.DLL du dossier Windows\System32. Bon maintenant le code s'exécute sans erreur.

    Par contre, ce code ne me retourne rien. Dans les pages que je copie, le texte associé au lien ne correspond pas au lien lui-même. Par exemple sur le site si je copie "Cliquer ICI pour accéder au site", le texte du lien est "ICI" et le lien est par exemple https://www.google.fr

    J'ai donc testé avec le texte identique au lien. Ça tombe bien, car dans ton message, en dessous du code, j'ai copié ce texte :

    Dans le cas contraire,
    on peut automatiser le navigateur internet via CDP Framework (et donc se passer du presse papier):
    https://www.developpez.net/forums/d2...r-vba-excel/#3

    Selon la structure de la page web, on peut envisager une solution Power Query.

    Sinon, il faudra se tourner vers d'autres outils capable de faire du web-scraping (Power Automate par exemple).



    Donc il y a bien un lien avec le texte identique (https://www.developpez.net/forums/d2...r-vba-excel/#3)

    Mais en exécutant le code, toujours aucun affichage.
    En déboguant, dans la boucle For i, le "matches.Count" retourne 0, donc il ne trouve rien...

    Je confirme que c'est la galère d'exploiter le contenu du presse-papier en VBA.

    Je vais regarder du côté de Power Query ou Power Automate au cas où.

    Encore Merci d'avoir pris le temps de me réponse.

  4. #4
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 210
    Par défaut return link in code
    Bonjour

    c'est tout a fait normal que tu n'obtienne rien avec la solution de deedolith

    le data object contient ce que tu a sélectionné a main levée (selon tes dires) sauf qu'il ne contient pas le code html mais le INNERTEXT de ce que tu a sélectionné

    c'est a dire le texte brut sans format et sans balisage

    a moins que tu ai fait click droit et non pas copier mais copier le lien

    pour faire ce genre de chose il y a plusieurs astuces possible

    mais dans tout les cas on ne passe pas par le dataobject .gettext

    la meilleure solution vba que je connaisse c'est encore le transfert temporaire dans webbrowser

    qui quand on colle on colle le OUTERHTML

    PARTI DE LA TU SCRUTE LE DOCUMENT avec les librairies (si encore dispos de IE) de l'arborescence html
    le webbrowser est dans un userform( pas obligé que le userform soit affiché)
    mais avec les pages html ou php d'aujourd'hui c'est pas gagne

    ou alors un paste sur une feuille temporaire (la aussi tu aura le html et donc la possibilité de récupérer les hyperlinks

    sinon après il y a power query mais là on est hors de mon domaine

  5. #5
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 349
    Par défaut
    Bonjour

    un exemple de code Power Query pour extraire les liens contenus dans cette page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let
        Source = Web.BrowserContents("https://www.developpez.net/forums/d2178235/logiciels/microsoft-office/excel/macros-vba-excel/recuperer-lien-hypertexte-presse-papier-vba/"),
        #"Table extraite à partir de code Html" = Html.Table(Source, {{"Column1", "BODY"}}),
        #"Fractionner la colonne par délimiteur" = Table.ExpandListColumn(Table.TransformColumns(#"Table extraite à partir de code Html", {{"Column1", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"),
        #"Fractionner la colonne par délimiteur1" = Table.ExpandListColumn(Table.TransformColumns(#"Fractionner la colonne par délimiteur", {{"Column1", Splitter.SplitTextByDelimiter("#(cr)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"),
        #"Fractionner la colonne par délimiteur2" = Table.ExpandListColumn(Table.TransformColumns(#"Fractionner la colonne par délimiteur1", {{"Column1", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"),
        #"Lignes filtrées" = Table.SelectRows(#"Fractionner la colonne par délimiteur2", each Text.Contains([Column1], "www") or Text.Contains([Column1], "http"))
    in
        #"Lignes filtrées"
    ce code peut sembler long mais il est obtenu en utilisant uniquement l'interface utilisateur (aucun codage en dur)

    A partir du Web / Texte
    Trois étapes successives "Fractionner la colonne" : par espace, puis par #(cr) et enfin par #(lf) (choisir dans les options les caractères spéciaux pour ces deux derniers - et à chaque fois, fractionner en lignes et non en colonnes)
    il ne reste plus qu'à filtrer les lignes contenant http ou www.

    Non testé mais je pense qu'on pourrait transformer ce code en fonction pour l'exécuter sur plusieurs url simultanément

    Stéphane

  6. #6
    Invité de passage
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2025
    Messages : 5
    Par défaut Suite
    Bonjour,

    @patmeziere : Merci pour ton message. Concernant la solution webbrowser, si j'ai bien compris je fais un userform avec un webbrowser ?
    Comment insérer un webbrowser dans un userform ? J'avoue que je ne connais pas.

    La solution de passer par une feuille temporaire n'est pas idéale car le site que je copie contient beaucoup de photos, animations, etc, donc c'est hyper long en collant sur une feuille.
    Encore merci d'avoir pris le temps de me répondre.



    @Raccourcix : Merci également pour ta réponse. Il faut que je me mette à Power Query pour tester.

    À bientôt.

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 333
    Par défaut
    Citation Envoyé par Lesurferau59 Voir le message
    Concernant la solution webbrowser, si j'ai bien compris je fais un userform avec un webbrowser ?
    Comment insérer un webbrowser dans un userform ? J'avoue que je ne connais pas.
    Hello,
    pas la peine d'utiliser un userform pour récupérer des infos de pages avec Internet Explorer. Il suffit en VBA d'employer l'objet COM Internet.Application.
    Le souci avec Internet Explorer c'est qu'il commence à dater et qu'il n'est plus mis à jour. De moins en moins de site web sont compatibles avec lui. Dans ce cas il faut trouver une autre solution comme par exemple CDP Automation for VBA qui permet de piloter Edge ou Chrome.
    Voici un exemple de code VBA avec Internet Explorer qui fonctionne avec la page du forum Excel Macros de Developpez.com
    Dans ce code , on liste tous les sujets de la première page du forum en récupérant le titre , l'auteur et le lien de la page des sujets.
    On affiche les résultats dans la feuille Developpez du classeur.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #If VBA7 Then
     Public Declare PtrSafe Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
    #Else
     Public Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
    #End If
    Sub Test_IE_ListeSujets_XL_Dev()
    ' J.P Août 2025
        Dim cellDep As Range, x As Integer
        Dim listeSujets As Collection, sujets As Object, sujet As Object
        Dim IE As Object, IEDoc As Object, elem As Object
    1   On Error GoTo ErrHandler
        Set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = True
    2   IE.navigate "https://www.developpez.net/forums/f664/logiciels/" & _
                             "microsoft-Office/Excel/macros-VBA-Excel/ "
    3   WaitReady IE ' attente du chargement de la page
    4   With IE.Document
    5      Sheets("Developpez").Range("A2:C100").value = ""
    6      Set cellDep = Sheets("Developpez").Range("A2")
    7      Set sujets = .querySelectorAll("ol.threads > li.threadbit") ' tag ol de classe thread suivi du tag li de classe threadbit
           Debug.Print ("================== Lecture des sujets ==========================")
           For x = 0 To sujets.length - 1
              Set sujet = sujets.Item(x)
            ' Debug.Print sujets.Item(x).querySelector("h3.threadtitle").innerText 
            ' Debug.Print sujets.Item(x).querySelector("div.author").innerText  (
            ' Debug.Print sujets.Item(x).querySelector("h3.threadtitle > a").getAttribute("href") 
    8         cellDep.offset(x, 0).value = Replace(sujet.querySelector("h3.threadtitle").innerText, vbCrLf, "") ' tag h3 de classe threadtitle
    9         cellDep.offset(x, 1).value = Replace(sujet.querySelector("div.author").innerText, vbCrLf, "") ' tag div de classe author
    10        cellDep.offset(x, 2).value = sujet.querySelector("h3.threadtitle > a").getAttribute("href") ' tag h3 de classe threadtitle suivi du tag a 
            Next x
           Debug.Print CStr(x) & " sujets traités"
           Set sujet = Nothing: Set sujets = Nothing
        End With
    11  IE.quit
        Set IE = Nothing: KillIE  ' KillIE supprime le processus ieexplorer si il est encore vivant après le IE.Quit
        Exit Sub
    ErrHandler:
         Debug.Print "Erreur ligne " & Erl & " -> " & Err.Description: IE.quit: Set IEDoc = Nothing: Set IE = Nothing
    End Sub
    Sub EffacerSujets()
       Sheets("Developpez").Range("A2:C100").value = ""
    End Sub
    Sub WaitReady(IE As Object)
       'On boucle tant que la page n'est pas totalement chargée
       Do While IE.ReadyState <> 4 Or IE.Busy
          DoEvents: sleep (100)
       Loop
    End Sub
    Sub KillIE()
      Dim objWMI As Object, objProc As Object, colProc As Object
      Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
      Set colProc = objWMI.ExecQuery("Select * from Win32_Process Where Name = 'iexplore.exe'")
      For Each objProc In colProc
          objProc.Terminate
      Next
    End Sub
    Pour afficher le code HTML résultant après exécution des scripts javascripts de la page Web à analyser il faut utiliser l'outil de développement du navigateur (pour IE on le fait apparaître avec la touche F12)
    Voici ce que cela donne pour la page utilisée dans le code VBA ci-dessus :
    Nom : HtmlforumDeveloppezMacroXL.png
Affichages : 268
Taille : 63,5 Ko
    Surlignés en jaune les éléments utilisés dans le code VBA pour aller chercher les informations.

    Nom : ResultatsListeSujets.png
Affichages : 266
Taille : 30,1 Ko

    Ami calmant, J.P

  8. #8
    Invité de passage
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2025
    Messages : 5
    Par défaut Ne fonctionne pas
    Merci Ami calmant pour ta participation à ma question.

    Dans un premier temps, l'exécution du code proposé m'indiquait une erreur d'exécution à la ligne 38 :
    Nom : Erreur01.jpg
Affichages : 428
Taille : 8,7 Ko
    J'ai donc supprimé temporairement tout ce qui est après Err.Description, c'est à dire ": IE.quit: Set IEDoc = Nothing: Set IE = Nothing"

    Ensuite, en exécutant ce code, il me retourne une autre erreur :
    Nom : Erreur.jpg
Affichages : 419
Taille : 10,7 Ko

    Donc ça ne retourne pas l'exemple de la feuille Excel affiché dans ta proposition. Je pense que ce soit parce que IE n'est plus maintenu par Windows.


    Mais j'ai bien peur que ça ne puisse fonctionner avec le site que je récupère via un Copier/coller. En effet, la page est protégée par un mot de passe, donc récupérer le HTML de la page directement en VBA risque de récupérer uniquement le code du formulaire de saisie du mot de passe. D'autre part, avec cet exemple, je vais récupérer tous les liens de la page, or, je ne souhaite que les liens qui sont dans ma sélection que je copie (car la page est très lourde).

    En tout cas, encore merci d'avoir participé à ma requête.

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 333
    Par défaut
    Citation Envoyé par Lesurferau59 Voir le message
    Dans un premier temps, l'exécution du code proposé m'indiquait une erreur d'exécution à la ligne 38 :
    Nom : Erreur01.jpg
Affichages : 428
Taille : 8,7 Ko
    J'ai donc supprimé temporairement tout ce qui est après Err.Description, c'est à dire ": IE.quit: Set IEDoc = Nothing: Set IE = Nothing"
    Ensuite, en exécutant ce code, il me retourne une autre erreur :
    Nom : Erreur.jpg
Affichages : 419
Taille : 10,7 Ko

    Donc ça ne retourne pas l'exemple de la feuille Excel affiché dans ta proposition. Je pense que ce soit parce que IE n'est plus maintenu par Windows.
    Mais j'ai bien peur que ça ne puisse fonctionner avec le site que je récupère via un Copier/coller. En effet, la page est protégée par un mot de passe, donc récupérer le HTML de la page directement en VBA risque de récupérer uniquement le code du formulaire de saisie du mot de passe. D'autre part, avec cet exemple, je vais récupérer tous les liens de la page, or, je ne souhaite que les liens qui sont dans ma sélection que je copie (car la page est très lourde).
    En tout cas, encore merci d'avoir participé à ma requête.
    Hello,
    j' ai fait une erreur dans mon code le numéro de ligne 1 est mal placé cela devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       On Error GoTo ErrHandler
    1    Set IE = CreateObject("InternetExplorer.Application")
    c'est alors sur la ligne 1 qu'il y a une erreur . Cela est bizarre car normalement Internet Explorer est toujours accessible en Windows 10 ou en Windows 11 sauf si le windows est en entreprise avec une version qui est limitée par des contraintes de sécurités .
    Sinon il faut essayer de passe à CDP . Dans ce cas on peut piloter par exemple Edge avec interaction comme par exemple remplir le texte pour un utilisateur ou un mot de passe et cliquer sur un bouton dans une page Web.
    Ami calmant, J.P

  10. #10
    Invité de passage
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2025
    Messages : 5
    Par défaut Suite
    Merci jurassic pork.

    Je ne connaissais pas le protocole CDP. Il faut que je me prenne du temps pour étudier le "biniou". J'ai vu que tu avais fait une discussion sur le sujet (https://www.developpez.net/forums/d2...protocole-cdp/).

    Si jamais ça fonctionne pour récupérer les liens hypertextes d'une page web, je reviendrai le signaler ici.

    Encore Merci.

Discussions similaires

  1. Vider le presse papier en VBA
    Par knecmotet dans le forum Général VBA
    Réponses: 17
    Dernier message: 05/03/2022, 20h50
  2. [AC-2010] lien hypertexte dans presse papier.
    Par fab.85 dans le forum IHM
    Réponses: 0
    Dernier message: 01/05/2015, 10h11
  3. [XL-2003] Nettoyage de la RAM et presse-papier avec VBA
    Par Romanuche dans le forum Excel
    Réponses: 4
    Dernier message: 03/08/2009, 18h27
  4. [XL-2003] Lien hypertexte dans Mail généré via VBA excel
    Par jerem7w dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 16h12
  5. Réponses: 12
    Dernier message: 10/06/2006, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo