XL 2013 Déclenchement d'évènement sur HyperLinks (Via un Module de Classe personnalisé)

laurent950

XLDnaute Accro
Bonjour le Forum,

Objectif : Substituer Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) ---->>>> Par un ------>>> Module de Classe personnalisé gérant les évènements

Ci-dessous détail du Module a substituer avec explication du code avec (fichier Excel Joins)

Je souhaite substituer le déclanchement récupéré avec le module dédié aux évènements des feuilles Excel par un Module de Classe avec gestion d'évènement.
Pour le principe j'ai réalisé un Programme (Qui ici ne sert qu'en phase de test uniquement "Ce Programme ne sert à rien en soit")
Sous détail de l'action réalisé suite au click sur l'hyperLien créer.
Donc programme créer sur le fichier Excel ci-joint :

1) Création de l’hyperlien :
* Adresse (Aucune pour cette Hyperlien)
* ScreenTip (Nom de l'objet 2 "qui sera à Rattacher à L'objet 1")
Nota : le lien sera inscrit en cellule C7 de la feuille Bd (La cellule C7 contient le nom de l'Objet 1) avec la création du lien dans cette même cellule.

2 ) hyper lien créé. Active L'objet 2 Liée par l'hyperlien.
Objectif de cette Hyperlien
* Au Click sur ce lien (déclanchement d'un évènement)
* Donc suite au click en cellule C7 de la feuille Bd
a) Depuis les Modules des Feuilles Excel
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
'
Code........
'
End Sub
**********************************************************************************
Objectif a réalisé ci-dessous.
b) Depuis un Module de Classe (en Utilisant "WithEven" "Even"... ect)
Je souhaiterais déclencher sur le même principe que :
Le Code en Modules de Feuilles (que j'ai créé pour l'exemple)

Projet : Substituer cette procédure (ci-dessous) par un Module de Classe qui gère l'évènement HyperLinks.

VB:
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
' Pour rappel c'est un test est cette action sera pour
' interagir avec une autre application que celle d'Ecxel
'
' -------------------------------------------------------------------------
'   Sélection du Shapes "Text Dessin 1" au moyen de l'hyperlien de la cellule C7 de la feuille Bd
' -------------------------------------------------------------------------

' Suite à l'événement déclenché
    Dim Objshape As Shape           ' Objet 1 (Shapes de Nom : "Dessin 1")
    Dim NomShapeText As String      ' Objet 2 (Shapes de Nom : "Text Dessin 1")
    Dim FtestPourLien As Worksheet  ' Feuille ou les 2 Objets Shapes sont dessinés
'
' Pour Info :
' Le nom de l'objet 2 est inscrit dans la Variable Objet "Target"
'    * dans l'option Infobul : ScreenTip:=CStr("Text Dessin 1")
' Sous détail (ci dessous)
'    NomShapeText = Target.ScreenTip
' Création de l'objet liée Au Choix* avec : Set Objshape =
'    - *Shapes("Text Dessin 1") OU *Shapes(NomShapeText) OU *Shapes(Target.ScreenTip)
'
' Création de l'objet liée : Objet 2 (Shapes de Nom : "Text Dessin 1")
    Set Objshape = Feuil2.Shapes(Target.ScreenTip)
' Selection de cette Objet Liée
    Objshape.Select
' Active Feuil2
    Set FtestPourLien = Worksheets("Feuil Shape test Lien")
    FtestPourLien.Activate
End Sub

Sous détail du principe du programme :
En Feuille Excel "Feuil Shape test Lien" il y a deux Objets :
Objet 1 (Objet Grap 1) dont cet Objet est un Shapes du Nom de : Dessin 1
Objet 2 (TextBox 2) dont cet Objet est un Shapes du Nom de : Text Dessin 1
Chacun de ces 2 Objets sont indépendant :
Objectif Liée les Objet 1 et Objet 2 au Moyen d'un hyper lien
La méthode :
L'objet 1 de nom Dessin 1 (Inscrit en cellule "C:7" de la feuille Bd)
Création d'un Lien dans cette cellule au Moyen "Hyperlinks.Add"
Utilisation pour cette Hyperlinks.Add de :
* Anchor (Pour la cellule "C:7" de la Feuille Bd)
* Address (Aucune adresse car je veux rien Rattacher a ce lien)
* SubAddress (Pour la Feuille "Feuil Shape test Lien" Cellule "C:7")
* ScreenTip (Le Nom de l'objet à rattaché : Objet 2 "Text Dessin 1")
Le Click sur le lien en Cellule C7 Feuille Bb :
* Renvois vers le Module des Feuille Excel (Dans la procédure) :

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
- Le Code est écrit dans cette procédure.
L'objet Sélectionné est l'Objet 2 (Shapes de Nom : "Text Dessin 1")

Ceci est une Feuille teste pour comprendre et apprendre le même fonctionnement (mais depuis un Module de Classe a réaliser)
Nota : Ces deux Objets seront des Objets situés sur une autre application que celle d'Excel.

Si vous avez la connaissance pour Substituer le dit Module de la feuille par un Module de classe personnalisé gérant les évènements un Grand merci à vous

Cdt
 

Pièces jointes

  • Declanchement Evenement Hyperlink Module de Classe V1.xlsm
    30 KB · Affichages: 21
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Juste des idées en attendant.
Un Shape a une propriété OnAction qui peut prévoir l'exécution d'une procédure dans un module standard.
Le nom du Shape qui en a déclenché l'exécution y est connue comme Application.Caller
Rien n'empêcherait cette procédure de confier le reste de l'exécution à un module de classe qui détiendrait une collection d'objets réunissant chacun deux Shape concernant la même chose.
Ça impliquerait un tableau des listes de paires de noms de Shape pour initialiser la collection.
Il n'y aurait pas à priori de liens hypertextes impliqués dans le dispositif.
 

laurent950

XLDnaute Accro
Re @Dranreb

Explication : J'ai Résolu (Possible avec Module de Classe "Solution dans le fichier joins)

Ici les 2 Shapes représenté (sont uniquement utilisé pour le test)
Dans les Faits :
- Le Shapes (Objet 1) et un Objet sur une feuille de dessin Autocad : Une Polyligne (AcadLWPolyline)
- Le Shapes (Objet 2) et un Objet sur une feuille de dessin Autocad : Une MultiTexte (AcadMtext)
C'est deux Objets peuvent (être liées par l'application Autocad par une création de Block)
- Si je veux comparer le Block d'Autocad à Excel ce serait comme (Grouper les 2 Shapes)
C'est deux Objets différents sur Autocad (On un élément Clef : un Identifiant Unique pour Chaque Objet)
- Cette identifiant c'est le Handle (Une clef string unique a l'objet)
Nom1 = Objet1.Handle
Nom2 = Objet2.Handle
C'est pour cette raison que je stock sur une feuille Excel :
- Dans la Cellule "C:7" (l'identifiant unique de l'objet 1 avec la propriété handle)
- Et bien sur dans ScreenTip (l'identifiant unique de l'objet 2avec la propriété handle)
C'est pour cela que je souhaite :
- Avoir la même action de récupération mais avec un Module de Classe
- Comme cela en Cliquant j'ai L'ID Objet 1 (Inscrit dans la cellule "C:7") et dans l'objet récupérer
L'ID Objet 2 (Inscrit dans L'objet récupérer de type "As Hyperlink" dans ScreenTip)
donc j'ai trouvé la solution :

Création d'un Module de classe : AppEvents
VB:
Private WithEvents xlApp As Application
'
Private Sub Class_Initialize()
   Set xlApp = Application
End Sub
'

Private Sub xlApp_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink)
' Pour rappel c'est un test est cette action sera pour
' interagir avec une autres application que celle d'Ecxel
'
' -------------------------------------------------------------------------
'   Selection du Shapes "Text Dessin 1" au moyen de l'hyperlien de la Cellule C7 de la Feuille Bd
' -------------------------------------------------------------------------

' Suite à l'évenement déclanché
    Dim Objshape As Shape           ' Objet 1 (Shapes de Nom : "Dessin 1")
    Dim NomShapeText As String      ' Objet 2 (Shapes de Nom : "Text Dessin 1")
    Dim FtestPourLien As Worksheet  ' Feuille ou les 2 Objets Shapes sont dessinés
'
' Pour Info :
' Le nom de l'objet 2 est inscrit dans la Variable Objet "Target"
'    * dans l'option Infobul : ScreenTip:=CStr("Text Dessin 1")
' Sous détail (ci dessous)
'    NomShapeText = Target.ScreenTip
' Création de l'objet liée Au Choix* avec : Set Objshape =
'    - *Shapes("Text Dessin 1") OU *Shapes(NomShapeText) OU *Shapes(Target.ScreenTip)
'
' Création de l'objet liée : Objet 2 (Shapes de Nom : "Text Dessin 1")
    Set FtestPourLien = Worksheets("Feuil Shape test Lien")
    Set Objshape = FtestPourLien.Shapes(Target.ScreenTip)
' Selection de cette Objet Liée
    Objshape.Select
' Active Feuil2
    FtestPourLien.Activate
End Sub

Créer une variable Public associer au module de classe dans un Module standard:
Private WithEvents xlApp As Application

Pour déclencher Class_Initialize() dans la classe et instancier la variable xlApp

j'utilise ThisWorkbook est je créé un événement à l'ouverture qui va déclencher Class_Initialize()

Private Sub Workbook_Open()
Set ThisApplication = New AppEvents
End Sub

Maintenant le lien est actif toute au long de l'ouverture du fichier.

Je vous Poste mon Fichier @Dranred
Vous Pouvez m'en faire un retour pour savoir si j'ai bien codé.
 

Pièces jointes

  • Declanchement Evenement Hyperlink Module de Classe V2.xlsm
    33.2 KB · Affichages: 18
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 095
Messages
2 085 249
Membres
102 836
dernier inscrit
Ali Belaachet