Microsoft 365 Création d'un liens Hypertexte vers une forme sous Excel 2016

Bensalem

XLDnaute Nouveau
Bonjour a Vous et Excellent année 2020 ;

Je travail sur un fichier excel avec deux onglets :

La première feuille contient un plans avec des formes qui sont liées avec des liens Hypertextes vers leurs contenu dans la deuxième feuille.

Ma question ou mon besoin est le suivant :est ce que je pourrais faire l’inverse CAD quand on clique sur le contenu de la deuxième feuille (contenu ) on arrive directement sur sont emplacement dans la 1er feuille (Plan);Est ce que c'est faisable par un code VBA ou par un liens hypertexte.?
En PJ le fichier pour mieux visualiser ma question
Merci d’avance
 

Pièces jointes

  • Plan Almouggar.xlsm
    131.5 KB · Affichages: 11

James007

XLDnaute Barbatruc
Bonsoir à tous,

Si je comprends bien... par exemple l'objet Cube 261 est lié à la feuille Contenu cellule B1186 ...

Mais tes 336 destinations dans la feuille Contenu ne sont concrètement liées qu'à 155 Noms Uniques de Formes ...dans ton plan ...

Du coup, la table des correspondances est impérative, et son élaboration aurait été d'autant plus facile à établir si tu avais décidé, au départ, d 'avoir une rationalisation logique et systématique des Noms des Shapes ...
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Code à mettre sur la feuil3 (Contenu) en remplacement du code actuel.
Pour retourner sur la Shape, dans la feuille Contenu, double-cliquer en colonne B nom du meuble. Edit 3: dans la zone colorée en bleu.
Ça sélectionne la, ou successivement les (si pas de correspondance 1 pour 1), Shape(s) d'origine sur la feuille Plan PE.
Maintenant sélectionner n'est peut-être pas suffisant car c'est peu visible.
On peut ajouter une Shape flèche temporaire flashy pour préciser la location (Edit2: ajouté flèche temporaire)
Et surement un scroll de la fenêtre si la Shape est hors cadre. (Edit1: ajouté recadrage)
Edit 3: Ajout du fichier

VB:
Option Explicit

#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim oCell As Range
    
    Application.ScreenUpdating = False
    
    ' Clear the color of all the cells
    Cells.Interior.ColorIndex = 0
 
    Target.Interior.ColorIndex = 8
    For Each oCell In Target
        Me.Rows(oCell.Row).Interior.ColorIndex = 8
    Next oCell
    
    Application.ScreenUpdating = True
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim H As Hyperlink
    Dim Adresse As String
    Dim LenAdresse As Integer
    Dim i As Integer
    Dim NbShapes As Integer
    Const ColonneNomDuMeuble As String = "B"
    
    Application.EnableEvents = False
    
    'Ramène la Target (ByVal) sur la colonne Nom du meuble
    If Target.Column <> Me.Range(ColonneNomDuMeuble & "1").Column Then
        Set Target = Me.Range(ColonneNomDuMeuble & Target.Row)
        
        'Si cellules fusionnées en colonne Nom du meuble prend la 1ère pour le n° de ligne correct
        If Target.MergeCells Then
            Set Target = Target.MergeArea(1)
            'Recréé la sélection de toutes les lignes du meuble
            Application.EnableEvents = True
            Target.Select
            Application.EnableEvents = False
        End If
            
        'MsgBox Target.Address
    End If
    
    Adresse = Me.Name & "!" & ColonneNomDuMeuble & Target.Row
    LenAdresse = Len(Adresse)
    NbShapes = 0
    
     For Each H In ThisWorkbook.Worksheets(1).Hyperlinks
        Select Case H.Type
            Case 0
                'MsgBox "in cell: " & H.Parent.Address
            
            Case 1
                'MsgBox "in shape: " & h.Shape.Name
                If Right(H.Name, LenAdresse) = Adresse Then
                    'MsgBox H.Name & " " & Adresse & " " & H.Shape.Name
                    NbShapes = NbShapes + 1
                    
                    'Sélectionne la Shape sur la feuille Plan PE
                    ThisWorkbook.Worksheets(1).Select
                    H.Shape.Select
                    
                    'Place la Shape dans le Visible Range
                    If Intersect(H.Shape.TopLeftCell, ActiveWindow.VisibleRange) Is Nothing _
                    Or Intersect(H.Shape.BottomRightCell, ActiveWindow.VisibleRange) Is Nothing _
                    Then
                        ActiveWindow.ScrollRow = Application.Max(1, H.Shape.TopLeftCell.Row - ActiveWindow.VisibleRange.Rows.Count / 2)
                    End If
                    
                    'Fait clignoter une flèche rouge pour visualiser la Shape
                    For i = 1 To 4
                        Call ShowDeleteArrow(True, H.Shape)
                        Sleep (150)
                        DoEvents
                        Call ShowDeleteArrow(False, H.Shape)
                        Sleep (150)
                        DoEvents
                    Next i
                End If
        End Select
    Next H
    
    Application.EnableEvents = True
    
    If NbShapes = 0 Then MsgBox "Shape non trouvée !"
End Sub

Private Sub ShowDeleteArrow(Action As Boolean, Sh As Excel.Shape)
    Dim ScreenUpdating As Boolean
    Static Arrow As Excel.Shape
    Const ArrowWidth = 100 '80
    Const ArrowHeight = 40 '25
    Const ArrowName = "ShowArrow"
    
    'Save ScreenUpdating at function entry
    ScreenUpdating = Application.ScreenUpdating
    
    'Delete Arrow
    If Not Action Then
        Arrow.Delete
        Set Arrow = Nothing
        Application.ScreenUpdating = True
        Application.ScreenUpdating = ScreenUpdating
        Exit Sub
    End If
    
    'Show Arrow
    On Error Resume Next
    If Not Arrow Is Nothing Then
        Arrow.Delete
        Set Arrow = Nothing
    Else
        ActiveSheet.Shapes(ArrowName).Delete
    End If
    On Error GoTo 0
    
    Set Arrow = ActiveSheet.Shapes.AddShape(msoShapeLeftArrow, _
                                            Sh.Left + Sh.Width + 5, _
                                            Application.Max(0, Sh.Top + (Sh.Height / 2) - (ArrowHeight / 2)), _
                                            ArrowWidth, _
                                            ArrowHeight)
    Arrow.Name = ArrowName
    
    'Couleurs de la flèche
    With Arrow.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent2
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0
        .Transparency = 0
        .Solid
    End With
    With Arrow.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 112, 192)
        .Transparency = 0
    End With

    Application.ScreenUpdating = True
    Application.ScreenUpdating = ScreenUpdating
End Sub
 

Pièces jointes

  • Plan Almouggar.xlsm
    140.3 KB · Affichages: 11
Dernière édition:

Discussions similaires