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

OpenOffice & LibreOffice Discussion :

Lien hypertexte relatif en macro


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre à l'essai
    Lien hypertexte relatif en macro
    Bonjour à tous,

    J'ai un programme qui me permet de gerer une liste d'EPI avec tout plein d'info dessus dont sa notice et sa facture. Ces deux éléments sont enregistrés en pdf sur l'ordi.
    Une boite de dialogue, pilotée par macro, me permet de remplir tous les champs, effectuer des calculs, ... et sélectionner la notice et la facture sur le disque.
    J'en ressors le chemin d'accès depuis la racine que j'arrive à transformer en lien hyper texte.

    l'arborescence de mon dossier est ;
    EPI
    EPI.ods
    Notices_factures
    Notice01.pdf
    Facture01.pdf
    ...

    Problème :
    Ce lien hypertexte renvoi vers une adresse absolue : impossible donc de déplacer mon dossier "EPI" ou de l'envoyer à quelqu'un, au risque de "casser" mes liens.

    Actuellement mes liens renvoient vers "home/martin/documents/EPI/Notices_factures/Notice01.pdf"
    J'ai essayé de la transformer en "./Notices_factures/Notice01.pdf" mais dès que je ferme le fichier, à la ré-ouverture le lien s'est remis en absolu.

    Questions :
    Comment faire pour que les liens hypertexte restent avec une adresse relative à l'adresse du fichier ?


    Merci

    Martin

  2. #2
    Membre expert
    Bonjour,

    EDIT (Oups, c'est pas du VBA) Utilises ThisWorkbook.Path qui donne le chemin absolu du fichier qui contient la macro, pour construire un lien absolu.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim urlDossierParent As String
    Dim u As String
    Dim n As Long
       u =  ThisComponent.getURL()
       For n = Len(u) To 1 Step -1
          If Mid(u, n, 1) = "/" Then Exit For
       Next n
       urlDossierParent = Left(u, n - 1)
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Membre à l'essai
    Bonjour,

    Merci pour votre retour.

    Malheureusement la solution proposée revient toujours à avoir une adresse absolue de mes pdf.

    Une fois que l'utilisateur a entré les données, il faudrait que les liens créés pour les pdf soient en adresse relative au .ods. Cela permettrait de pouvoir bouger l'ensemble du dossier EPI (ou le partager avec un autre utilisateur) et de pouvoir utiliser les liens créés précédemment quelque soit l'adresse de ce dossier.

    En espérant être clair dans ma question
    Merci

    Martin

  4. #4
    Membre expert
    Citation Envoyé par m.arrouavignon Voir le message
    Malheureusement la solution proposée revient toujours à avoir une adresse absolue de mes pdf.
    Absolue :Oui, mais comme elle est calculée à partir de l'emplacement du fichier, et si les autres fichiers sont encore dans la même position relative, on peut bouger l'ensemble !
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Membre à l'essai
    Bonjour,

    Merci de prendre le temps de m'aider.

    Soit je n'arrive pas à le mettre en place, soit cela ne marche pas.

    Un fichier test en PJ.

    Mon fichier .ods est à "/home/martin/Bureau/EPI/testHL.ods"
    Quand l'utilisateur sélectionne un fichier (qui sont tous rangé dans un dossier fils du dossier où est le .ods", la boite de contrôle à la valeur "/home/martin/Bureau/EPI/Notice_facture/Notice.pdf"


    Mon soucis c'est que si je déplace mon dossier "EPI" de bureau vers "Documents" par exemple, le lien p toujours "/home/martin/Bureau/EPI/Notice_facture/Notice.pdf" et non pas vers "/home/martin/Documents/EPI/Notice_facture/Notice.pdf" et le fichier est donc introuvable.

    Pour moi si le lien est absolue, même si calculé à partir du chemin du fichier .ods, et bien il ne sera plus valable en cas de déplacement du dossier puisque calculé au moment de l’exécution de la macro.


    Mon but est d'arriver à lancer une première fois la macro et sélectionner mon PDF. Le lien se met en "C3".
    Si je ferme, que je déplace le dossier "EPI" (donc le dossier "Notice" bouge aussi), et que je réouvre le fichier, j'aimerais que le lien soit toujours valide et qu'il pointe vers la nouvelle adresse du pdf.

  6. #6
    Membre expert
    Re,

    Il suffit d'actualiser le lien à l'ouverture du fichier.

    L'ensemble du code (sans formulaire) :
    Code OBasic :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
    Option Explicit
    Sub bouton_cliquer
        Dim dlg As Object  
        Dim cel As Object  
        Dim url as String
        ' url dossier notice
        url =  urlDossierParent(ThisComponent.getURL())    & "/Notice_facture"     
        ' boite de dialogue "Ouvrir"  
        dlg = CreateUnoService("com.sun.star.ui.dialogs.OfficeFilePicker") 
        ' filtres
        dlg.AppendFilter("Fichier pdf (*.pdf)", "*.pdf")
        dlg.setCurrentFilter("Fichier pdf (*.pdf)","*.pdf")
        ' chemin par défaut pour la boîte de dialogue  
        dlg.SetDisplayDirectory(url)  
        ' affiche la boîte de dialogue "Ouvrir" 
          If dlg.Execute() = 1 Then
            url = ConvertToURL(dlg.Files(0)) 
            cel = thisComponent.Sheets.getbyName("Feuille1").getCellRangebyName("C3")
            call lien(cel,"Notice.pdf",url)
        End If  
    End sub
    Sub ActualiseLien
        Dim url as String
        Dim nom as String
        Dim cel As Object
        Dim fds as object  
        Dim fld as object  
        url =  ThisComponent.getURL() 
        cel = thisComponent.Sheets.getbyName("Feuille1").getCellRangebyName("C3")
        fds = cel.TextFields
        If fds.Count > 0 then
          fld = fds.getByIndex(0)
          url =  urlDossierParent(url) & Mid(fld.url, InStr(1, fld.url, "/Notice_facture/"))     
          fld.url = url
        End If  
    End sub
    Sub lien(cel as Object,txt as String, url as String)
        Dim fld As Object 
        Dim ctx As Object 
          fld = ThisComponent.createInstance("com.sun.star.text.TextField.URL")  
        fld.Representation = IIF(txt = "", url, txt)
          fld.URL = url
          cel.String = ""  
           ctx = Cel.getText("")  
          ctx.insertTextContent(ctx.createTextCursor(), fld, False)  
    End Sub
    Function urlDossierParent(url as String) As String
        Dim str As String
        Dim n As Long
        str = url
        For n = Len(str) To 1 Step -1
            If Mid(str, n, 1) = "/" Then Exit For
        Next n
        urlDossierParent = Left(str, n - 1)
    End Function


    Et ton fichier :
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  7. #7
    Membre à l'essai
    Bonjour,


    Super, tout marche comme je le souhaite.
    J'ai fait des tests avec votre code et finalement la partie "ActualiserLien" n'a pas l'air nécessaire.

    Je pense que c'est la façon dont je créais le lien (avec le dispatcher) qui n'était pas la bonne !!


    Merci encore pour votre temps,

    Martin

  8. #8
    Membre expert
    Citation Envoyé par m.arrouavignon Voir le message

    Super, tout marche comme je le souhaite.
    J'ai fait des tests avec votre code et finalement la partie "ActualiserLien" n'a pas l'air nécessaire.
    Au contraire, c'est cette partie, exécutée à chaque ouverture du classeur, qui sert lorsque l'ensemble classeur et notices est déplacé vers un autre emplacement.

    Par contre, ne sachant pas comment ça va servir, j'ai laissé le bouton avec la possibilité de choisir une notice.
    Mais à mon avis ça ne sert à rien, il aurait suffit d'établir le lien manuellement la première fois pour qu'ensuite, ce lien soit mise à jour par "ActualiseLien" chaque fois que le classeur et les notices sont déplacées.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  9. #9
    Membre à l'essai
    Citation Envoyé par Patrice740 Voir le message
    Au contraire, c'est cette partie, exécutée à chaque ouverture du classeur, qui sert lorsque l'ensemble classeur et notices est déplacé vers un autre emplacement.
    Et pourtant j'ai supprimé cette partie du code, et mes liens fonctionnent où que soit le dossier. Même avec une impression PDF.

  10. #10
    Membre expert
    Citation Envoyé par m.arrouavignon Voir le message
    Et pourtant j'ai supprimé cette partie du code, et mes liens fonctionnent où que soit le dossier. Même avec une impression PDF.
    On ne doit pas parler de la même chose !
    Si tu déplaces (donc sans conserver l'emplacement original) le fichier et les notices, le lien existant ne fonctionnera plus (bien sûr, sans utiliser le bouton qui re-définirait un nouveau lien).
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  11. #11
    Membre à l'essai
    Et pourtant ... C'est bien ce qu'il se passe.

    J'ai une boite de dialogue qui demande plusieurs renseignement dont deux pdf.
    Une macro écrit toutes ces valeurs dans une feuille à la dernière ligne vide.

    Et les références vers les pdf sont bien relatives à l'emplacement du fichier.ods puisque si je déplace le dossier (qui contient le fichier et les pdf), les liens restent valides depuis le fichier.ods mais aussi depuis une impression pdf de ce fichier.

  12. #12
    Membre expert
    Et aussi si tu envoies le dossier à un autre utilisateur ?
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  13. #13
    Membre à l'essai
    Oui les liens restent valides même avec un partage du dossier vers un autre ordi (avec un sous linux et l'autre sous windows )

    Donc je pense que la façon de créer les liens que vous m'avez fournie, créée bien des liens relatifs au chemin du fichier .ods (ou du moins quand le lien est dans le dossier du fichier ou dans un dossier "fils")

  14. #14
    Membre expert
    Citation Envoyé par m.arrouavignon Voir le message
    Oui les liens restent valides même avec un partage du dossier vers un autre ordi (avec un sous linux et l'autre sous windows )

    Donc je pense que la façon de créer les liens que vous m'avez fournie, créée bien des liens relatifs au chemin du fichier .ods (ou du moins quand le lien est dans le dossier du fichier ou dans un dossier "fils")
    Les liens créés sont des liens absolus, mais quand tu partages un dossier, le dossier ne bouge pas, donc les liens continuent à fonctionner !
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur