Récupérer lien hypertexte

Bonjour,
Je souhaiterais extraire le lien hypertexte contenu dans un texte d’une cellule.
J’ai bien vu une fonction dans Excel, mais elle me renvoie une erreur dans Calc :slight_smile:

ERREUR DE LIBRE OFFICE
Une erreur de structure de script s’est produite lors de l’exécution du script Standard.Recuplien.Recuplien en Basic.
Message : wrong number of parameters!

Ma macro ::
Function Recuplien(rng As Range)
'Extraire l’URL d’un hyperlien
On Error Resume Next
Recuplien = rng.Hyperlinks(1).Address
If Recuplien = 0 Then Recuplien = “”
End Function

L’appel de la fonction dans ma cellule
=recuplien(D31)

Merci pour l’aide (ou une autre idée !)
Patrice

Je ne vois pas comment cela pourrait marcher :

Range n’est pas un type de donnée en Basic. Où avez-vous été chercher ce code ?

En cherchant “récup* hyperlien cellule calc”, je trouve :
https://forum.openoffice.org/fr/forum/viewtopic.php?t=59565&hilit=calc+hyperlien+cellule+récup*

pas très digeste; mais c’est un début.

encore une fois, l’IA est plutot pertinente :

Convert clickable hyperlink to viewable URL - #3 by PYS

sinon par UDF :

Function Recuplien(cellRef as String)
  cell = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(cellRef)
  if cell.getTextfields.count > 0  then
    Recuplien = cell.getTextfields.getByIndex(0).URL
  else
    Recuplien = ""
  endif
End Function

image

Cela récupère le lien, mais quand “je fais glisser” ma cellule pour passer à la cellule du dessous cela reste en A1 et ne passe pas en en A2, etc.
Sinon c’est exactement çà !
Merci

y aurait bcp de façon de ruser;
la plus simple à glisser =RECUPLIEN( "A" & ROW() )

Trop bien !
Je tournais autour d’une ruse mais je ne l’avais pas !
=RECUPLIEN(“D”&LIGNE())
Merci beaucoup.
Patrice
(PS : je ne sais pas comment clôturer la discussion sur ce forum)

Guide - Comment utiliser le site Ask - The Document Foundation Wiki #Mark_an_answer_as_Solution

Merci encore : Hyperlien - [PatCatNat's]

Bonjour,
Finalement j’ai un problème à l’ouverture de mon fichier : Il ouvre le module et affiche une boîte d’erreur.

Erreur d’exécution BASIC.
Propriété ou méthode non trouvée : CurrentController
Il faut que je ferme la boîte de dialogue autant de fois que la fonction est écrite dans ma feuille, puis les cellule sont vides. Un F9 réactive alors la fonction !
Une idée pour modifier le code et que cela s’ouvre sans message d’erreur ?
Merci par avance.
Patrice

Bonjour,
Finalement j’ai un problème à l’ouverture de mon fichier : Il ouvre le module et affiche une boîte d’erreur.

Il faut que je ferme la boîte de dialogue autant de fois que la fonction est écrite dans ma feuille, puis les cellule sont vides. Un F9 réactive alors la fonction !
Une idée pour modifier le code et que cela s’ouvre sans message d’erreur ?
Merci par avance.
Patrice

le contexte est discuté en long et en large par exemple là : Is there a way to get the current sheet name WITHOUT using "ActiveSheet"?
ou là : Asked before: How can a Calc macro refer to the cell it was called from?


pour lever l’ambiguité sur la feuille où se trouve la formule, on peut expliciter :
=RECUPLIEN(FEUILLE(), "A" & LIGNE())

et le code Basic :

Function Recuplien(sheetNum as Integer, cellRef as String)
  sheet = ThisComponent.sheets.getByIndex(sheetNum-1)   ' skip CurrentController.ActiveSheet
  cell = sheet.getCellRangeByName(cellRef)
 ...

Bonjour et merci,
J’ai appliqué, mais maintenant j’ai un arrêt sur la ligne de déclaration sheet = et une boîte de dialogue

L’appel de la fonction : =RECUPLIEN(FEUILLE();“D”&LIGNE())
Pour info j’ai la dernière mise à jour de Lire Office et j’ai aussi mis à jour Java.
Merci pour votre aide
Patrice

ça veut juste dire qu’il reste qqpart un appel à recuplien avec 1 seul paramètre.

pour clarifier, repartir d’un fichier vide et/ou renommer les fonctions recuplien1 et recuplien2

Bonjour et merci,
J’ai essayé mais c’est pareil !
J’ai torturé Chat GPT hier très longtemps. Pour finir il n’est pas possible de faire une fonction sur Calc pour extraire l’URL créée à partir de Ctrl+k. Ce n’est possible de l’extraire à partir sur une cellule créé avec la fonction =LIEN.HYPERTEXTE(“URL”;“texte”). Je ne vois pas trop l’intérêt car dans ce dernier cas, j’ai donc l’URL directement…
Merci pour tout. Je garde ta fonction que j’appliquerai si j’ai un grand nombre d’extractions à faire et ferais alors un copier/collage spécial dans les cellules alors pour effacer la fontion et en ayant l’URL !
Bon dimanche
Patrice

Bonjour,
Je vous propose cette solution ci-dessous et le lien en vidéo pour montrer comment ça fonctionne :
Extraire TOUS les hyperliens d’une cellule LibreOffice Calc (Macro & RegEx)

Sub ExtraireHyperliensSelection
    Dim oDoc As Object
    Dim oSelection As Object
    Dim i As Long, j As Long
    Dim nColCount As Long, nRowCount As Long
    Dim oCell As Object

    oDoc = ThisComponent
    oSelection = oDoc.CurrentSelection

    ' Vérifier si la sélection est une cellule unique
    If oSelection.supportsService("com.sun.star.sheet.SheetCell") Then
        TraiterUneCellule(oSelection)
        
    ' Vérifier si la sélection est une plage de cellules (Rectangulaire)
    ElseIf oSelection.supportsService("com.sun.star.sheet.SheetCellRange") Then
        nColCount = oSelection.Columns.Count
        nRowCount = oSelection.Rows.Count
        
        ' Boucle à travers toutes les cellules de la plage sélectionnée
        For i = 0 To nColCount - 1
            For j = 0 To nRowCount - 1
                oCell = oSelection.getCellByPosition(i, j)
                TraiterUneCellule(oCell)
            Next j
        Next i
    Else
        MsgBox "Veuillez sélectionner une cellule ou une plage de cellules valide.", 48, "Erreur de sélection"
    End If
End Sub

Sub TraiterUneCellule(oCell As Object)
    Dim oTextFields As Object
    Dim oField As Object
    Dim sLinks As String
    Dim k As Integer
    Dim oSheet As Object
    Dim nCol As Long, nRow As Long
    Dim oTargetCell As Object

    ' Accéder aux champs de texte de la cellule
    oTextFields = oCell.TextFields
    sLinks = ""

    ' Parcourir tous les champs pour trouver les URLs
    If oTextFields.Count > 0 Then
        For k = 0 To oTextFields.Count - 1
            oField = oTextFields.getByIndex(k)
            
            ' Vérifier si le champ possède une propriété URL
            If HasProperty(oField, "URL") Then
                ' Ajouter l'URL au cumul
                If sLinks <> "" Then
                    sLinks = sLinks & " " ' Espace temporaire
                End If
                sLinks = sLinks & oField.URL
            End If
        Next k
    End If

    ' Application de la logique "Regex" : Saut de ligne avant chaque http
    ' On s'assure que chaque lien commence sur une nouvelle ligne
    If sLinks <> "" Then
        ' On remplace "http" par "Saut de ligne + http"
        ' Note : On nettoie d'abord les éventuels doubles sauts créés
        sLinks = Replace(sLinks, "http", Chr(10) & "http")
        
        ' Nettoyage : si la chaîne commence par un saut de ligne, on l'enlève
        If Left(sLinks, 1) = Chr(10) Then
            sLinks = Mid(sLinks, 2)
        End If

        oSheet = oCell.getSpreadsheet()
        nCol = oCell.CellAddress.Column
        nRow = oCell.CellAddress.Row
        
        ' On cible la cellule à droite (Column + 1)
        oTargetCell = oSheet.getCellByPosition(nCol + 1, nRow)
        oTargetCell.String = sLinks
        
        ' Activer le renvoi à la ligne automatique
        oTargetCell.IsTextWrapped = True
    End If
End Sub

' Fonction utilitaire pour vérifier l'existence d'une propriété sans générer d'erreur
Function HasProperty(oObj As Object, sPropName As String) As Boolean
    HasProperty = False
    On Error Resume Next
    HasProperty = Not IsNull(oObj.getPropertyValue(sPropName))
    On Error GoTo 0
End Function

Bien (même très bien !) Le problème est que je date mes fichiers en enregistrant sous. Je n’ai jamais le même nom de fichier, donc si je mets la macro dans le fichier, elle ne s’exécutera pas dans un autre fichier ! J’aurais préféré une fonction qui peut être exploitée dans n’importe quel fichier Calc si c’est possible.

Merci.
Patrice

A 01:35 de la vidéo, j’écris la solution à votre demande. La macro dans un fichier s’exécutera dans un autre fichier. C’est pas une fonction. Mais, c’est pratique pour l’utiliser quand on a besoin.

Entièrement d’accord et merci.
Si je fais un nouveau fichier, je ne peux pas l’utiliser ; c’est dommage…
Patrice

Faux
Si c’est enregistré dans “mes macros”; il est possible de réutiliser cette macro dans un nouveau fichier calc ou nouveau document.
Bon courage pour la suite