Problème Lien Hypertext

Résolu
Bonjour,
Voici mon problème :
J'ai une feuille excell retranscrivant des données de fichiers, placés dans un dossier bien à part. J'ai besoin de créer une colonne donnant la possibilité d'ouvrir directement ces fichiers (images, video ou audio).
Quand j'execute les commandes de liens hypertext une à une ça fonctionne très bien je peux ouvrir tous les fichiers désignés.
En revanche j'ai parfois quelques centaines, voire milliers, de fichiers à lier, et les traiter un à un peut-être long et surtout source d'erreur.
Je cherche donc à créer des liens hypertext automatiques qui puissent ouvrir les fichiers directement et pas le dossier d'emplacement des dits fichiers (ce que j'arrive à faire).
Je ne suis pas un expert en tableur excell et ne connais pas les macros ou autres fonctions.
Je sais que mon problème est peut-être un peu redondant mais je n'arrive pas à faire fonctionner les diverses réponses qui ont été faites autour de ce sujet depuis quelques années...
^^
Merci d'avance pour votre aide.

6 réponses

  1. Modérateur
    Bonjour,

    Tous les fichiers à ouvrir sont dans un seul répertoire?
    Ce répertoire ne contient que ces fichiers à ouvrir?
    Ces fichiers sont répertoriés dans ta feuille Excel?
    Si oui, en qu'elle colonne?
    Décris nous également ta feuille Excel... Qu'elle donnée trouve t'on et dans qu'elle colonne...

    🎼 Cordialement,
    Franck 🎶
    0
    1. Bonjour pijaku,

      alors :
      Mon fichier .xls se présente avec plusieurs onglets comme suit;
      1-Images, 2-vidéo et 3-audio, sur chaque onglet les colonnes se répartissent de façon identique ; A-Nom du créateur, B-Date de Création, C-Durée (pour les videos et audios), E-Nom du fichier (cette colonne me sert d'établissement de lien hypertext, en gros le nom du fichier à ouvrir doit être cliquable et exécutable) et dernière colonne F-Statut.

      Tous les fichiers sont ouvrables et sont classés de la même façon. Ex : les fichiers images répertoriés en onglet 1-Images, sont rangés dans un dossier bien distinct des autres et se nomme 1-Fichiers images, il en va donc de même pour les autres fichiers répertoriés sur les autres onglets.

      Mes fichiers .xls sont tous construits de la même façon mais n'ont pas le même nombre de lignes, cela peut aller de vingt à 3000.

      J'arrive donc à faire la manip pour un fichier comportant une cinquantaine de ligne voire une centaine mais pour 3000. Je sais exécuter une manip qui ouvre le dossier cible mais pas plus.

      Je trouve complètement fou que l'on ne puisse pas tout simplement créer un lien hypertext en ayant sélectionner la colonne au préalable puis de désigner le répertoire source des fichiers. Ca me chatouille un peuqu'on ait pas pensé à ce genre de possibilité sans passer par fonction "machpro" avec des codes zarbis. Pour un tableur de données de masse c'est balodpaille. :)
      Comme tu peux l'imaginer je ne suis pas un utilisateur très affuté d'excell, perso je suis plus photoshop, illustrator et Indesign... ^^

      J'ai essayé les fonctions =LIENHYPERTEXT.... mais soit je m'y prends mal ou je n'ai certainement pas bien compris les façons de procéder.
      Bien entendu si je dois changer l'ordre de mes colonnes ce n'est pas un problème.

      Si tu pouvais me donner une bonne astuce ça me ferait gagner un temps de ouf!
      Merci d'avance

      A+
      0
      1. Modérateur
        Qu'elle version d'Excel as tu?
        0
      2. 2007
        0
    2. Modérateur
      Autre chose : colonne E-Nom du fichier Est ce que les extensions des fichiers (.jpg etc...) sont indiquées?
      0
      1. Non les extensions ne sont pas mentionnées quelles soient jpg ou amr
        0
      2. Modérateur
        Ouille...
        Je revois ma copie alors...
        0
    3. Modérateur
      Dans l'attente des réponses aux deux questions, voici comment j'envisage les choses :

      Pour créer la macro : Manipulations à ne réaliser qu'une seule fois !
      1- Ouvrir un nouveau classeur Excel
      2- Tapez Alt +F11
      3- Insertion/Module
      4- Copiez collez ce code :
      Sub Creation_Liens()
      Dim objShell As Object, objFolder As Object
      Dim Chemin As String, fichier As String
      Dim Lig As Long, DLig As Long
      
          Set objShell = CreateObject("Shell.Application")
          Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
      
          If objFolder Is Nothing Then
              MsgBox "Abandon opérateur", vbCritical, "Annulation": Exit Sub
          Else
              Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
          End If
          DLig = Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row
          For Lig = 2 To DLig
              fichier = Range("E" & Lig).Value
              ActiveSheet.Hyperlinks.Add Anchor:=Range("E" & Lig), Address:=Chemin & fichier, TextToDisplay:=fichier
          Next Lig
      End Sub

      5- Fermez la fenêtre Visual Basic For Application
      6- Enregistrer sous :
      => Nom du fichier : Créer_Liens,
      => Type : Macros Complémentaires Excel 97-2003 (en bas de la liste)
      7- Fermer Excel.

      Pour utiliser la macro : Manipulations à réaliser à chaque exécution!
      1- Ouvrez un des classeurs concernés
      2- => Version Excel >= 2007 : Ruban, onglet développeur, cliquez sur Compléments
      => Version Excel < 2007 : menu Outils/Macros complémentaires
      3- Cochez la case Créer_Liens
      4- OK
      5- => Version Excel >= 2007 : Ruban, onglet développeur Cliquez sur Macros
      => Version Excel < 2007 : Menu Outils/Macros/Macros
      => Toutes versions : tapez Alt + F8
      6- Dans le nom de la macro, saisir : Creation_Liens puis cliquez sur Exécuter

      Amélioration possible :
      En cas d'absence d'un fichier, le lien hypertexte est créé quand même. Mais lors d'un clic dessus, vous aurez un message d'erreur. Il est possible de traiter ces cas pour, par exemple, ne pas créer de lien si le fichier n'existe pas...
      0
      1. Modérateur
        Voici le code modifié pour le souci d'extension... Pour l'installer suivre la démarche décrite ICI

        Sub Creation_Liens()
        Dim objShell As Object, objFolder As Object
        Dim Fichiers() As String
        Dim Chemin As String, nomFichier As String, fichier As String
        Dim Lig As Long, DLig As Long, Ind As Long
        
            Set objShell = CreateObject("Shell.Application")
            Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
        
            If objFolder Is Nothing Then
                MsgBox "Abandon opérateur", vbCritical, "Annulation": Exit Sub
            Else
                Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
            End If
            'récupération et stockage de tous les noms de fichiers du répertoire avec extension
            fichier = Dir(Chemin & "*.xls")
            Do While Len(fichier) > 0
                ReDim Preserve Fichiers(Ind)
                Fichiers(Ind) = fichier
                Ind = Ind + 1
                fichier = Dir()
            Loop
            
            DLig = Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row
            For Lig = 2 To DLig
                nomFichier = Range("E" & Lig).Value
                For Ind = LBound(Fichiers) To UBound(Fichiers)
                    If Fichiers(Ind) Like nomFichier & "*" Then
                        ActiveSheet.Hyperlinks.Add Anchor:=Range("E" & Lig), Address:=Chemin & Fichiers(Ind), TextToDisplay:=nomFichier
                        Exit For
                    End If
                Next Ind
            Next Lig
        End Sub 


        🎼 Cordialement,
        Franck 🎶
        0
        1. Hello,
          A y est, j'ai essayé et là lors de l'exécution de la macro une fenêtre VBA s'ouvre et me dit :

          Erreur d'exécution '9':
          L'indice n'appartient pas à la sélection.

          Je clique sur "débogage" pour voir... Le code de la Macro apparait est la ligne

          For Ind = LBound(Fichiers) To UBound(Fichiers)

          s'affiche en jaune.

          C'est grave Docteur? ^^

          Merci d'avance
          0
        2. Modérateur
          Salut,

          Erreur de débutant de ma part... J'ai fait des tests avec des fichiers excel (.xls) alors que toi, tu as besoin de tous types de fichiers...
          Donc...
          Lorsque le code fait ceci :
          fichier = Dir(Chemin & "*.xls")

          on obtient : Len(fichier) = 0 (car tu n'as pas de fichier Excel .xls dans ton répertoire...)
          Et donc, la boucle pour remplir la variable tableau ne se fait pas car Len(fichier) = 0 :
          Do While Len(fichier) > 0

          Par conséquent, le code bug lorsqu'on lui demande de boucler sur le contenu d'une variable tableau vide...
          For Ind = LBound(Fichiers) To UBound(Fichiers) 


          Voici donc le code corrigé :

          Sub Creation_Liens()
          Dim objShell As Object, objFolder As Object
          Dim Fichiers() As String
          Dim Chemin As String, nomFichier As String, fichier As String
          Dim Lig As Long, DLig As Long, Ind As Long
          
              Set objShell = CreateObject("Shell.Application")
              Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
          
              If objFolder Is Nothing Then
                  MsgBox "Abandon opérateur", vbCritical, "Annulation": Exit Sub
              Else
                  Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
              End If
              'récupération et stockage de tous les noms de fichiers du répertoire avec extension
              fichier = Dir(Chemin & "*") 'ici on ne laisse que l'étoile pour tous types d'extension
              Do While Len(fichier) > 0
                  ReDim Preserve Fichiers(Ind)
                  Fichiers(Ind) = fichier
                  Ind = Ind + 1
                  fichier = Dir()
              Loop
              
              DLig = Columns(5).Find("*", , , , xlByColumns, xlPrevious).Row
              For Lig = 2 To DLig
                  nomFichier = Range("E" & Lig).Value
                  For Ind = LBound(Fichiers) To UBound(Fichiers)
                      If Fichiers(Ind) Like nomFichier & "*" Then
                          ActiveSheet.Hyperlinks.Add Anchor:=Range("E" & Lig), Address:=Chemin & Fichiers(Ind), TextToDisplay:=nomFichier
                          Exit For
                      End If
                  Next Ind
              Next Lig
          End Sub


          Avec mes excuses...
          0
        3. Alors là, je dis "Chapeau bas Monsieur!"
          Ça marche nickel
          C'est exactement ce qu'il me faut.
          Magique!
          Merci beaucoup.
          Merci pour la réactivité, ton temps passé et le résultat! Du grand art!
          A+
          0
        4. Ah une dernière petite chose par rapport à l'utilisation de cette magnifique macro ^^
          En fait j'ai installé la macro directement sur le ruban et hop en un clic c'est fait!
          Chose magique aussi c'est que même si on a envie de changer de place la colonne liée "E" en "A" ou autre, ben, ça fonctionne quand même...
          Du grand Art jvoudi!
          Bye
          0
        5. Modérateur
          De rien.
          ça fait plaisir de lire ton ... plaisir!

          A bientôt.
          Franck
          0
      2. Alors je vois bien la manip...
        2 ou 3 choses :

        -Lors de la création de la macro, ce qui me parait bizarre c'est de fermer la fenêtre vba avant d'enregistrer. Bon soit j'ai d'abord fais comme tu l'indiques.

        -l'enregistrement du fichier doit se faire certainement dans un répertoire bien spécifique de windows/microsoft car quand j'exécute la macro, le logiciel ne me la trouve pas.

        -En revanche j'ai essayé de créer cette macro en traitant un fichier contenant des données tests, les liens se font sans soucis en me demandant mon répertoire source. Mais à l'activation d'un lien une fenêtre s'ouvre et me dit "Impossible d'ouvrir le fichier spécifié".

        Merci encore!
        0
        1. Modérateur
          -Lors de la création de la macro, ce qui me parait bizarre c'est de fermer la fenêtre vba avant d'enregistrer. Bon soit j'ai d'abord fais comme tu l'indiques.
          C'est normal, le projet VBA s'enregistre en même temps que le classeur auquel il appartient.

          -l'enregistrement du fichier doit se faire certainement dans un répertoire bien spécifique de windows/microsoft car quand j'exécute la macro, le logiciel ne me la trouve pas.
          En effet. L'enregistrement se fait dans le Add-ins de la suite Office. Le chemin d'accès est quelque chose comme : C:\Users\franck.nom\AppData\Roaming\Microsoft\AddIns

          Mais à l'activation d'un lien une fenêtre s'ouvre et me dit "Impossible d'ouvrir le fichier spécifié".
          ça ne le fait pas systématiquement?
          Sinon retente de lancer à nouveau la macro...
          0
        2. Super! merci de répondre aussi rapidement!
          Je teste le "bazar" demain et te tiens au courant
          merci encore
          0