Création d'un lien hypertext automatique et en temps réel

Bonjour à tous

Je suis à la recherche d'une fonction qui malheureusement semble trop avancée pour moi en macro, car je ne vois même pas par ou commencer

En fait je souhaiterais que dans ma colonne B à partir de la ligne 5 toutes les cases dans lequel je rentre un numéro se transforme directement en lien

hypertexte après validation de la cellule.

Exemple

- je rentre le numéro 123456 en B6

- je valide

- La case B6 est maintenant un lien hypertexte portant le nom du numéro entrée 123456 et le lien hypertexte est "www.cloud.fr/123456.pdf"

- même procédure pour toute les autres lignes de B6 à B (infini) numéro XXXXXXX lien ww.cloud.fr/XXXXX.pdf (le numéro peut avoir un nombre de digit différent et parfois comporter des lettres.)

Pas de soucis pour faire ça en formule en inscrivant dans la colonne a coté (mais ça fait une colonne en plus et prend de la place), je pense que je réussirais aussi à faire quelque chose en macro mais cela impliquerait de "lancer" la macro à chaque fois en écrasant les numéros pour les remplacer par des liens hypertextes.

mais je ne vois pas comment faire pour que la macro soit active en arrière plan et que la chose se face en temps réel. est-ce que c'est possible déjà?

Merci d'avance pour vos réponses

Bonjour,

Deux solutions en fonction de la situation dans laquelle vous vous trouvez :
- Une procédure événementielle qui insère un hyperlien à chaque nouvelle entrée d'une valeur (procédure événementielle) :

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
    Application.EnableEvents = False
    If Not Application.Intersect(Target, .Columns(2)) Is Nothing Then Target.Hyperlinks.Add Target, "www.cloud.fr/" & Target & ".pdf"
    Application.EnableEvents = True
End With
End Sub

- Une procédure standard qui insère tous les liens d'un coup à activer à l'aide d'un bouton à partir de B2 jusqu'à la première cellule vide rencontrée :

Sub HYPERLIENS()
Dim L%
Application.EnableEvents = False
With ActiveSheet
    L = 2
    Do
        .Cells(L, 2).Hyperlinks.Add .Cells(L, 2), "www.cloud.fr/" & .Cells(L, 2) & ".pdf"
        L = L + 1
    Loop Until .Cells(L, 2) = ""
End With
Application.EnableEvents = True
End Sub

Cdlt,

51classeur5.xlsm (15.31 Ko)

Merci Ergotamine c'est le premier module qui correspond à mes attentes!

en attendant je continuais de regarder les différents sujets sur le net et notamment le tuto des événements worksheet de excel-pratique (qui correspond aux action en temps réel) je ne savais pas que ça portait ce nom là "évènements worksheet" ^^

et j'ai réussi à combiner les informations pour réussir à faire un début de macro aussi de mon coté

Private Sub Worksheet_Change(ByVal Target As Range)

    Target.Hyperlinks.Add Anchor:=Target, Address:= _
        "http://www.cloud.fr/" & Target.Value & ".pdf", TextToDisplay:=Target.Address

End Sub

le problème c'est que ça marche comme je veux mais sur toute la feuille

je vais du coup utiliser ton code ! qui lui marche bien seulement sur la colonne B, par contre une idée pour lui dire de démarrer qu'à la ligne 5 par exemple ? c'est pour pouvoir mettre une en-tête de tableau sans qu'il se transforme en hypertexte. mais si trop compliqué ou trop long pas grave ça sera pas très gênant, la fonction principale est là !! un grand merci pour ton aide !!

Bonjour,

Non il n'y a pas de soucis :

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
    Application.EnableEvents = False
    If Not Application.Intersect(Target, .Range("B5:B" & .Cells(.Rows.Count, 1).Row)) Is Nothing Then Target.Hyperlinks.Add Target, "www.cloud.fr/" & Target & ".pdf"
    Application.EnableEvents = True
End With
End Sub

La méthode Intersect de l'objet Application permet de déterminer si la cellule définie par Target, donc la cellule ou la plage déclencheur de l'évènement coupe la second plage. Donc je vérifie si cette intersection n'est pas vide via le Not Is Nothing, donc que cette intersection existe, donc que Target est dans ma plage de recherche, et dans ce cas je réalise mon action. Cette méthode s'utilise jusqu'à des intersections de 30 ranges diverses mais est souvent limité à 2 range dans ce genre de procédures.

Cdlt,

wow ça marche nickel !!! un grand merci !

alors mon niveau actuel ne me permet pas de comprendre tes explications

dans ma tête target c'est l'intersection de ligne et colonne et donc la case sélectionnée. et encore je suis sur que c'est une vision trop simpliste voir même erronée ^^

mais c'est vrai que c'est contre intuitif il n'y a pas une instruction contraire de nothing ?

de ce que je comprends au lieu de dire "If" tel chose "is nothing" donc vide, tu dois lui dire "if not" tel chose "is nothing" pour n'est pas vide, donc une négation de négation pour rendre l'info positive, je comprends maintenant pourquoi je comprends pas

Bonsoir,

En soit si on clique sur B5 et inscrit une valeur dedans alors l'élément Change de la feuille est déclanché. Target ici sera B5.
Application.Intersect renvoie s'il existe un recouvrement entre B5 et la plage allant de la cellule B5 à B et dernière ligne.
Donc si il existe une intersection ça me renvoie quelque chose. Sauf que le "quelque chose" est difficilement descriptible en langage VBA.
Donc on fait un raisonnement par l'inverse et regarde si l'intersection ne renvoie pas rien > Not Is Nothing

Dans ce cas si ça ne renvoie pas rien alors ça veut dire que ça renvoie quelque chose et que Target se trouve bien dans B5 à B et dernière ligne. Ce qui est le cas, la plage couvre bien B5.

Comme dit c'est un raisonnement par l'inverse, ça se rapproche des démonstrations des formules mathématiques quand à partir d'un cas on veut déterminer une généralité plus large alors on prouve que l'inverse n'est pas faux pour en déduire la généralité comme supposée vraie.

Cdlt,

C'est magnifiquement expliqué ! En fait si je comprends bien intersect ne fait pas lintersection entre les axes x et y de la feuille mais le recouvrement de la plage defini b5 / b (infini) avec la case sélectionnée, donc dans la profondeur, comme un calque qui passe sur un autre.

Target lui est bien lintersection x et y et donc l'adresse de la cellule.

J'espère que c'est bien ça, car je m'en voudrais de pas comprendre avec des explications aussi bien menées.

Après je suis encore très loin de reussir a pondre une macro aussi chouette en demarrant d'une page blanche.

Il va falloir que je reprenne depuis le début, car je maitrise pas encore les bases. je vais refaire les tutos du site

Encore merci pour tout et pour le temps passé ! C'est vraiment simpa !

Bonsoir,

Vous avez bien compris, dans la globalité c'est ça !

De toute façon il n'y aura que par la pratique et la manipulation que vous arriverez à maitriser les concepts et leurs subtilités, passant parfois par de l'arrachage de cheveux.

Bon courage.

Cdlt,

Rebonjour Ergotamine !

Je reviens sur ce petit code extra que vous m'avez concocté, je viens d'avoir quelques cas d'utilisation qui produit des erreurs. Mais le cas est très isolé et si cela demande de faire un code trop complexe, trop long, alors ne vous embêtez pas

En fait le fichier verra normalement des entrées "pas a pas", donc l'utilisateur rentre une valeur dans la première cellule, puis ensuite celle d'en dessous etc...

Et donc votre code fait le job parfaitement, a chasue entrée la valeur entrée dans le "target.row" et la plage spécifié se transforme en hypertexte.

Par contre si quelqu'un souhaite coller une plage de valeur sur la plage cible alors il se produit une erreur, car forcément le code a une instruction "target.row" donc une cellule, donc coller une plage donc plusieur cellules en même temps, il ne peut plus savoir a qu'elle cellule affecter le lien hypertexte. (Enfin j'imagine que c'est ça le problème)

Et pareil pour la suppression, si je supprime les lignes une par une pas de problème par contre si je supprime une plage de cellule alors erreurVous pensez que c'est jouable de transformer ce code pour permettre le collage d'une plage ? Et non seulement l'entrée d'une valeur dans une cellule?

Exemple copier une plage A3:A23 d'un fichier quelconque, le coller dans le fichier contenant votre code événement qui transforme les liens en hypertexte se situant en colonne B

Par contre il y aura peut-être une interférence avec le "cell.row.count" qui permet de définir en amont la zone intersect. Il ne peut pas savoir a l'avance la taille de la plage de cellule que je vais venir lui coller

Ha mince j'aurais du relire le post depuis le début car je pense que vous aviez anticipé le problème, est-ce que ma demande correspond au code avec le L% ??

Je fais une selection dans un fichier je copie, je me place sur la première cellule et je lance la macro ?

Bonjour,

Il suffit de demander (bon pas pour tout par contre) :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim C As Variant
With ActiveSheet
    Application.EnableEvents = False
    If Not Application.Intersect(Target, .Range("B5:B" & .Cells(.Rows.Count, 1).Row)) Is Nothing Then
        For Each C In Selection
            If C = "" Then
                C.ClearContents
                Else
                C.Hyperlinks.Add C, "www.cloud.fr/" & C & ".pdf"
            End If
        Next C
    End If
    Application.EnableEvents = True
End With
End Sub

Ainsi si je copie une plage de cellule vers la colonne B toute la plage est transformée en lien hypertexte. J'ai aussi géré la partie "effacement" des données.

En espérant que cela vous convienne.

Cdlt,

Edit : Le code avec le L fonctionnerait en effet, il est associé à un bouton, donc peut importe la cellule sélectionnée, la macro va forcer la sélection de la bonne cellule. Mais il recalcule les liens hypertextes de toutes les lignes, même si déjà présent. Donc si votre plage est grande, ça peut mettre du temps. A vous de voir ce qui correspond le plus à votre besoin.

Haaa super merci Ergotamine !!!

Je crois que j'ai en plus compris le code, mais pas assez bon pour l'imaginer et le construire !

Mettre en forme une idée en code je suis pas encore au point, j'arrive a faire quelques trucs mais je crois qu'il faut que je reprenne les bases, notamment les boucles.

Car la première fois que j'en ai fais en suivant le tuto, je suivait le tuto et voyait les effets sans trop comprendre, aujourd'hui j'ai une meilleur analayses des codes mais j'arrive pas a les créers de toutes pièces

En tout cas encore un grand merci pour votre aide !

Cela me sera utile, j'ai un cas ou je vais devoir "transférer" les données d'un ancien fichier, vers celui qui contiendra votre code vous m'avez fait gagner de précieuses "heures" car je sais que le fichier existe mais j'en ai pas encore apprécié la taille. Et je pense qu'il sera fournit.

Rechercher des sujets similaires à "creation lien hypertext automatique temps reel"