Lien hypertexte vers l'onglet "actif"

Bonjour/bonsoir,

Je suis entrain de créer un fichier Excel avec des "boutons de navigation" pour se déplacer plus vite car mes onglets ont beaucoup de colonnes (jusqu'à la colonne FZ). Pour faire ces boutons j'ai fait insertion, formes, et j'ai fait clic droit sur les formes pour insérer un lien hypertexte qui pointe sur un endroit de l'onglet en question). Le problème est que j'ai d'autres onglets identiques mais si je crée une copie du 1er onglet, le lien hypertexte va renvoyer vers le 1er onglet. Je dois donc dans le 2eme onglet faire clic droit sur le "bouton", modifier le lien hypertexte, et dans la section "emplacement dans ce document", changer la référence de la cellule pour pointer vers le 2eme onglet.

Étant donné que j'ai 31 onglets (1 par jour, nommés "01", "02", "03" etc) avec 7 produits (les colonnes A à Z sont réservées au produit 1, les colonnes AA à AZ pour le produit 2, les colonnes BA à BZ pour le produit 3 etc) et 7 boutons par produits, ça fait donc 7*7 boutons à modifier *31 onglets, soit plus de 1 500 modifications à faire à la main, je vous laisse imaginer le boulot

A ma connaissance Excel ne propose pas de faire de lien hypertexte vers l'onglet où est situé le lien hypertexte (c'est à dire que si je copie colle le lien hypertexte dans un autre onglet du même classeur, le lien amènera vers l'onglet d'origine et non pas le nouvel onglet où a été copié collé le lien).

Je sais pas si c'est très clair, je vous met un fichier simplifié en pièce jointe (j'ai mis 3 produits avec les liens dans l'onglet "01" et j'ai copié collé l'onglet "01" que j'ai renommé "02" pour correspondre à la 2ème journée. Si on clique sur un lien de l'onglet "02", ça nous renvoie vers l'onglet "01"). J'ai créé ce fichier sous Excel 2007 mais je travaille sur Excel 2010 au boulot.

J'aimerais si possible garder mon système de "bouton" (en insérant une forme) car ils sont indépendants des cellules donc l'emplacement des boutons ne bouge pas. La formule LIEN_HYPERTEXTE rentre dans une cellule et en fonction des produits la largeur des cellules n'est pas toujours la même donc les cellules avec les liens seraient décalées quand on naviguerait.

Peut être qu'une macro peut effectuer ces changements d'onglets des liens hypertextes ?

Si c'est pas clair n'hésitez pas à me demander

Merci d'avance

Bonjour,

par exemple pour ajouter un lien sur chaque onglet en cellule B2 pointant sur la même feuille en cellule A1

Sub AddHyperlinks()
Dim sh
For Each sh In Worksheets
 With Sheets(sh.Name)
  .Hyperlinks.Add Anchor:=.Range("B2"), Address:="", SubAddress:=sh.Name & "!A1", TextToDisplay:="A1"
 End With
Next

Bonjour,

Cela me paraît plutôt lourd ! Tant à réaliser qu'à gérer. Je te proposerais donc volontiers une solution macro qui me paraît infiniment plus économique...

Je reprends ton idée de formes pour naviguer dans la feuille, y compris les rectangles à coins arrondis (je les aime bien aussi ! ), mais de forme carrée. J'en fais 7, accolés pour faire une barre, et groupés. Les boutons carrés portent en libellé tes numéros de produits, de 1 à 7. Les boutons sont nommés (ça se renomme les formes) : P_1, P_2... P_7, ce qui permettra d'identifier le produit.

Le groupe est nommé : G_01 (sur la feuille 01), G_02 (sur la feuille 02), et il en sera de même pour toute autre feuille.

La seule opération longue pour mettre en place le dispositif est la réalisation du premier groupe. Ensuite, la duplication se fera par copie, voire encore plus simplement par copie de feuille pour générer les autres feuilles, et l'objet y sera...

Mon modèle ne te conviendra peut-être pas, j'ai l'habitude de travailler avec des objets de taille réduite, et j'ai donc conçu des carrés de 0,66 cm de côté, ce qui donne une barre de 4,62 cm, qui prend aisément place sur la ligne 1, sans gêner dès lors qu'on aura augmenté sa hauteur en conséquence. Mais tu es libre de modifier la taille et l'esthétique de l'ensemble... La seule chose qui importe pour le dispositif, ce sont les noms qui doivent se terminer par le numéro de produit (différent pour chacun, et le nom du groupe qu'il convient de conserver : G_ suivi du nom (numérique) de feuille.

Une fois le premier réalisé, donc, on passe à la macro qui va opérer les déplacements. La voici :

Sub DéplaFeuil()
    Dim k%, gr$, fa As Worksheet
    k = CInt(Right(Application.Caller, 1))
    k = (k - 1) * 26 + 1
    Set fa = ActiveSheet
    gr = "G_" & fa.Name
    Application.ScreenUpdating = False
    With ActiveWindow
        .ScrollColumn = k: .ScrollRow = 1
    End With
    With fa.Shapes(gr)
        .Left = (k + 1) * 60: .Top = 5
    End With
End Sub

Comme tu vois, rien de fantastique ! Et c'est bien en cela que c'est intéressant, car plus c'est simple et mieux cela fonctionnera de façon stable...

La macro récupère le numéro de produit (en identifiant le bouton appelant).

Ce numéro de produit lui permet de définir la colonne à cibler pour le déplacement : A pour le 1, AA pour le 2, jusqu'à FA pour le 7. Elle calcule ce numéro de colonne.

Elle affecte la feuille active à une variable. Puis elle reconstitue le nom du groupe à partir du nom de la feuille.

Après ces préparatifs, elle recadre la feuille (la fenêtre) sur la colonne voulue. Elle replace le groupe à une distance de 2 colonnes du bord de feuille recadré (le calcul est fait sur la largeur par défaut des colonnes, qui est de 60 points, il y aura sans doute des réglages à opérer selon l'organisation de tes feuilles de ce point de vue, et l'emplacement préférentiel où tu souhaites retrouver les boutons...)

Et c'est tout.

L'autre intérêt de la macro, c'est qu'il n'y en qu'une ! Elle suffit pour tous les boutons, et pour toutes les feuilles.

On l'affecte par clic droit sur le groupe > Affecter une macro. Une seule affectation, et chacun des 7 boutons déclenchera la macro...

Encore mieux, tu copies la feuille pour générer une nouvelle feuille, que tu renommes. Les boutons sont copiés avec la feuille, et l'affectation de la macro demeure. Inutile de la refaire, ils continueront de la déclencher.

La seule modication, outre le nom de l'onglet, est de modifier le nom du groupe pour qu'il corresponde à la feuille (sans cela le déplacement du groupe ne s'opèrerait pas puisque la macro constituant son nom à partir de la feuille ne le trouverait plus et tu aurais une erreur...)

Pour modifier le nom : clic droit sur le groupe (un bord) pour le sélectionner en tant que groupe (sans sélection des boutons individuels). Le nom apparaît dans la zone "Nom", située à gauche de la barre de formules. C'est là que tu le modifies. Puis tu valides impérativement en appuyant sur Entrée, et tu refais une sélection du groupe pour vérifier que le nouveau nom est bien pris en compte.

Je pense que ce sera beaucoup moins fastidieux à réaliser que le système que tu prévoyais.

Cordialement.


Merci pour vos réponses

MFerrand j'ai réussi à créer et renommer le groupe de forme (je savais pas que c'était possible).

Je comprends en partie la macro (j'ai fait un peu algorithmique très théorique mais pas du tout de VBA). Il y a un bémol, c'est qu'il ne faut qu'un groupe de bouton par onglet et la macro se charge de déplacer le groupe de boutons de gauche à droite. Ce qui fait que si je me déplace avec les ascenseurs (barre de défilement) je ne retrouve plus les boutons en haut de chaque produit. Le groupe de bouton est en effet en haut du dernier groupe de produit pour le quel on est allé grâce au bouton. C'est pour ça qu'à la base j'avais mis un groupe de bouton pour chaque produit (donc 7 groupes de boutons s'il y a 7 produits).

Autre bémol, les 60 points de largeur de colonne s'additionnent. Ce qui fait que pour le 1er produit, le groupe de bouton est espacé de 60 points sur la droite (je ne sais pas à quoi correspondent 60 points exactement, sur mon fichier ça correspond à un espace de 220 pixels environ) puis pour le 2eme produit le groupe de bouton est déplacé de 2 fois 60 points etc, ce qui fait que plus on va vers un produit élevé, plus le groupe de boutons se déplace petit vers la gauche pour au final sortir "du champs de vision". J'ai testé en mettant une valeur plus faible que 60 mais j'ai l'impression que ça se base systématiquement sur la colonne A. Donc au lieu de faire par exemple pour le produit 2 (dont la colonne commence en AA) un espacement de 60 à partir de la colonne AA, ça fait un espacement de 2 fois 60 à partir de la colonne A.

sabV ta macro est plus facile à comprendre mais insère une formule de lien hypertexte dans une cellule au lieu d'insérer un lien hypertexte dans une forme Mais merci de ton message !

Il n'est pas possible de faire une macro qui dit : si je clique sur le bouton nommé P_1 ça m'amène le curseur de la souris à la cellule A1 de la feuille active, si je clique sur le bouton P_2 ça m'amène à la cellule AA1 de la feuille active etc ? Ainsi j'aurais chaque groupe de bouton au dessus de chaque produit (il y aura donc plusieurs boutons nommés P_1 sur un même onglet, j'espère que ce n'est pas gênant) et l'équivalent du lien hypertexte créé avec la macro s'adapterait en fonction de la feuille active.

Merci encore et bonne journée/soirée

Bonsoir,

Aller en A1, AA1, BA1, etc., j'ose te faire remarquer que c'est exactement ce que fait la macro fournie !

Le problème de positionnement est à voir après que tu aies fixé la structure de ton fichier. Là, devant un fichier vide, j'opère simplement une multiplication par 60, qui correspond à la largeur en points par défaut, ce qui en l'état repositionne la barre toujours au même endroit... La façon de calculer la position pourra être à revoir selon le résultat à obtenir, ce n'est pas un problème majeur.

Ce qui importe c'est que lors d'un déplacement la barre suive pour permettre un nouveau déplacement immédiat. On obtiendra ce résultat selon la configuration...

Ensuite, comme tu disposes d'autres moyens de déplacements, ainsi que tu le dis, la barre peut être perdue de vue ! Rien d'insurmontable, il suffit d'un dispositif pour la rappeler là où tu es, par exemple une évènementielle qui la rapatrie au double clic sur la ligne 1... ou autre...

Cordialement.

Bonjour,

Avoir un seul groupe de bouton et réussir à régler le positionnement me parait compliqué. Même sur un nouveau fichier Excel, donc sans toucher aux largeurs de colonnes, la barre se décalait à chaque fois que je cliquait sur un produit. J'avais diminué et augmenté les 60 points mais la barre se décalait toujours.

N'est-il pas plus simple, comme je le pensais au début, d'avoir la feuille 01 (avec les 7 groupes de 7 boutons qui pointent vers la feuille 01 grâce à un lien hypertexte inséré dans chaque formule). Je copie 30 fois la feuille 01 et je renomme les copies 02, 03 etc pour avoir les 31 jours par mois (1 onglet par feuille). Chaque bouton étant nommé P_01, P_02 jusqu'à P_07. Il y a donc 7 boutons P_01, 7 boutons P_02 etc par feuille mais tous ces boutons renvoient vers la feuille 01. Je me positionne donc sur la feuille 02 et là une macro sélectionne les 7 boutons nommés P_01, fait un clic droit, modifier le lien hypertexte, emplacement dans ce document, et sélectionne la feuille 02 au lieu de la feuille 01. La macro sélectionne ensuite les 7 boutons P_02 et change le lien hypertexte pour mettre la feuille 02 au lieu de la feuille 01 et etc pour les autres boutons. Ensuite je vais sur la feuille 03 et j'active la macro qui va effectuer la même manip, puis sur la feuille 04 etc. Une fois que j'aurais exécuter la macro sur les 31 onglets je n'aurais plus besoin de la macro.

Ou bien faire une macro un peut comme tu proposais, qui fait : "si on clique sur un des 7 boutons nommés P_01 de la feuille active, ça nous amène à la cellule A1 de cette feuille" (si ça pouvait même sélectionner de A1 à R1 ça serait top. Il me semble qu'il faut utiliser "range" pour ça). Et etc pour les autres boutons P_02, P_03... Dans ce cas là il n'y aurait pas de lien hypertexte intégré dans les boutons, mais du moment que le résultat est le même c'est bon.

J'ai cherché sur internet mais avec toutes les fonctions (worksheet, activesheet, Cint, CommandButton1_Click etc) je suis un peu perdu. Il faudra que je m’intéresse aux macros qui sont très pratiques mais j'ai clairement pas le temps en ce moment. Après si je comprend la logique pour le 1er produit je pourrais normalement reproduire la démarche pour les 6 autres boutons

Encore merci, cordialement.

Bonjour,

En VBA, si on veut être efficace on commence par oublier toute idée de sélection...

J'ai fait une proposition alternative à l'utilisation de liens parce qu'elle me semblait infiniment plus aisée à mettre en place, et à gérer par la suite, économique et plus efficace...

Tu soulèves quelques écueils, que je ne peux considérer comme tels, juste des réglages basiques à opérer...

Mais la décision t'appartient, Que l'on adopte ou non l'une de mes propositions est tout à fait gratuit pour moi, je n'y trouve aucun intérêt particulier, sauf parfois du travail en plus !

Cordialement.

Bonjour,

Qu'entends tu par sélection ? Quand je parlais de sélectionner tous les boutons nommés P_01 dans ma 1ere proposition ? Ou bien quand je parlais de A1 à R1 dans la 2eme proposition ?

J'ai retéléchargé ton fichier et là la barre reste fixe (juste après la 2eme colonne donc en C, AC, BC etc). Mais chez moi (excel 2007) la barre se décalait pour au final sortir "du champs de vision".

J'ai copié collé le code VBA sur une copie de mon fichier excel sur lequel je travaille mais la barre se décale également pour au final sortir du champs de vision après quelques produits. Et j'ai beau remplacer la valeur 60 de "Left = (k + 1) * 60" par 10 ou 200 ainsi que remplacer la valeur 5 de "Top = 5" par 1 ou 200, l'emplacement de la barre ne change pas. Pourtant mes modifications s'enregistrent bien dans le code VBA et il me semble que hier soir quand je changeais les valeurs ça changeait l'emplacement de la barre

Cordialement,

Tu dois avoir des largeurs de colonnes différentes...

Remplaces déjà par ceci :

    With fa.Shapes(gr)
        .Left = fa.Cells(1, k + 2).Left: .Top = 5
    End With

Cela devrait stabiliser sur le bord de la 3e colonne de chaque produit, quelle que soit la largeur.

Ok, après pas mal d'essais je crois que j'ai enfin compris^^ En fait je copiais le groupe de boutons du fichier que tu as posté et je collais le groupe sur un autre fichier Excel. Puis je créais une nouvelle macro dans le nouveau fichier. Mais le groupe restait affecté à l'ancienne macro. Du coup dans mes tests des fois ça marchait, des fois ça marchait pas. J'étais complètement perdu.

Avec ta nouvelle ligne de code ça marche, le groupe se met à chaque fois en début de 3eme colonne Mais vu que j'ai des largeurs de colonnes différentes ça décale un peu selon les produits. Mais ça reste dans le champs de vision, c'est l'essentiel.

Par contre j'ai toujours pas compris comment caller si on prends l'ancienne ligne de code (avec les 60 points) car j'ai l'impression que au lieu de faire à chaque fois + 60 points à partir de la colonne de gauche active, ça fait 60 points multiplié par le numéro de produit sur le quel on clique, et ce à partir de la colonne A. Du coup le groupe sort forcément du champs de vision.

Mais bon je suis content, je progresse en VBA (le peu d'algorithmie que j'ai fait avant aide un peu aussi).

Tu parlais aussi de faire en sorte de ramener le groupe par un double clic. C'est compliqué à faire ?

Merci encore, cordialement

Bonjour,

Simplement : dans ta configuration, je suppose que tes feuilles seront de structure identique, donc en transférant la barre dans un autre fichier, ainsi que la macro, tu mets d'abord le dispositif au point pour ta première feuille.

Vérification du nom... mais surtout tu réaffectes la macro de façon qu'on pointe bien vers la macro qui est dans le fichier (et plus celle du fichier origine.

A partir de là pas de problème en dupliquant la feuille : tu n'as plus qu'à modifier le nom de groupe pour le mettre en adéquation avec celui de la feuille... Pour la macro c'est toujours la même macro qu'on pointe, dans le fichier.

Le positionnement se définit par les coodonnées Left et Top, distance en points (1 point=1/72 de pouce, environ 0,35 mm) de l'angle supérieur gauche de la forme aux bords respectivement gauche et haut de la feuille.

Le positionnement par rapport à une cellule est donc sans doute celui qui permet le meilleur repérage.

La définition par :

.Left = fa.Cells(1, k + 2).Left

k étant le numéro de colonne correspondant à la première colonne de la zone produit : A (1), AA (27), BA (53)... k+2 correspond aux colonnes C, AC, BC... jusqu'à FC. La barre s'alignera sur le bord gauche de cette cellule.

Pour ramener la barre à toi, le double-clic est l'un des moyens utilisables...

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Dim gr$
    gr = "G_" & Sh.Name
    With Sh.Shapes(gr)
        .Left = Target.Left: .Top = Target.Top
    End With
    Cancel = True
End Sub

Cette procédure d'évènement, de niveau classeur, car cela concerne toutes les feuilles, doit être placée dans le module ThisWorkbook et se déclenche automatiquement, lors d'un double-clic dans une cellule, en te fournissant 2 variables utilisables : Target qui est la cellule cliquée et Sh qui est la feuille où tu te trouves.

Le nom de la feuille te permet de reconstituer le nom du groupe et en l'alignant sur la cellule cliquée, la barre vient naturellement se repositionner dessus. (Cancel annule la résolution normale du double-clic, qui est l'édition de la cellule cliquée, ce qui suppose que tu n'entends pas te servir du double-clic normalement dans tes feuilles, sans quoi il faudrait délimiter des zones où la procédure interviendrait pour laisser le reste à la libre disposition du double-clic normal...)

Si tu as des feuilles sur lesquelles la procédure ne doit pas s'appliquer, il convient de mettre une condition pour qu'elle ne s'applique qu'à celles sur lesquelles elle doit s'appliquer (avec un Select Case sur le nom de la feuille...)

Cordialement.

ça marche, super merci beaucoup !

Bonne journée et bonne continuation

Rechercher des sujets similaires à "lien hypertexte onglet actif"