Créer une table de matières dynamique

pricer

XLDnaute Nouveau
Bonjour

Je travaille sur un fichier Excel comportant plusieurs feuilles. J’ai crée un feuille ‘’Menu’’ où j’ai mis les titres de l’ensemble de mes feuille, une table des matières en quelques sortes.
Je voudrai savoir s’il est possible de configurer cette feuille ‘’table des matières’’ de telle sorte que je ne puisse avoir que les grands titres 1, 2,3, etc. et c’est en cliquant sur chaque ligne que je trouverais les sous titres 1.1, 1.2, 1.3, etc. histoire d’avoir une feuille par trop encombrante.

Je vous remercie par avance de vos suggestions.

Pricer ..
 

job75

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Bonjour pricer,

Un fichier avec quelques données significatives ne serait pas superflu.

A priori il s'agirait de masquer les lignes qu'on ne veut pas voir, en utilisant une macro SelectionChange...

A+
 

pricer

XLDnaute Nouveau
Re : Créer une table de matières dynamique

Merci Job et hoerwind,

Je joints à mon message un fichier excel qui reprend ce qui j’ai écrit.
J’ai utilisé l’idée de hoerwind et ça donne un résultat très intéressent.

Merci,

Pricer,
 

Pièces jointes

  • exemple_pricer.xls
    17.5 KB · Affichages: 333

job75

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Re, salut hoerwind,

Cette macro dans le code de la 1ère feuille (clic droit sur l'onglet et Visualiser le code) :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim plage As Range, cel As Range, lig as Long
Application.ScreenUpdating = False
Set plage = Range("A4", Range("A65536").End(xlUp))
For Each cel In plage
 If InStr(cel, ".") Then cel.EntireRow.Hidden = True
Next
If Cells(ActiveCell.Row, 1) = "" Then Exit Sub
lig = ActiveCell.Row + 1
While InStr(Cells(lig, 1), ".")
  Rows(lig).Hidden = False
  lig = lig + 1
Wend
End Sub

Je l'ai écrite rapidement, on doit pouvoir l'améliorer.

A+
 

job75

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Re,

Ceci est mieux :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[COLOR="Red"]If InStr(Cells(ActiveCell.Row, 1), ".") Then Exit Sub[/COLOR]
Dim plage As Range, cel As Range, lig As Long
Application.ScreenUpdating = False
Set plage = Range("A4", Range("A65536").End(xlUp))
For Each cel In plage
 If InStr(cel, ".") Then cel.EntireRow.Hidden = True
Next
lig = ActiveCell.Row + 1
While InStr(Cells(lig, 1), ".")
  Rows(lig).Hidden = False
  lig = lig + 1
Wend
End Sub

A+
 

job75

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Bonjour JB, le forum,

Peut-être vaut-il mieux réserver le double-clic à l'activation des feuilles :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
Sheets(Cells(ActiveCell.Row, 1).Text).Activate
Cancel = Err = 0
End Sub

A+
 

Pièces jointes

  • exemple_pricer(1).zip
    12.2 KB · Affichages: 113

hoerwind

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Bonjour à vous tous,

Très impressionné par la macro de notre ami Jacques B.

Je voudrais la compléter pour qu'elle puisse remplacer un Plan (Grouper et créer un plan) sur une BD d'un millier de lignes.
Raison : il n'y a pas moyen (de façon simple) de trier un Plan, par exemple en y ajoutant (en-dessous) de nouvelles nomenclatures.

Un petit exemple en pièce jointe.
N'y connaissant rien en macros, je permets de solliciter l'aide de quelques membres de "l'équipe XLD".

Petite remarque : il faut bien se référer au nombre de caractères des codes en colonne A, car il y a des vides dans la numérotation alphabétique.
 

Pièces jointes

  • DoubleClicPlanV4.zip
    8.8 KB · Affichages: 90

hoerwind

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Salut CBernardT et les autres,

Solution astucieuse, mais qui hélas ne me convient pas.
Il y a, comme avec un Plan, beaucoup trop de manipulations, bien que le problème du tri soit résolu.

Je souhaite une solution avec double-clic qui fasse la même chose que les "+" et "-" d'un Plan.

Sous la pièce jointe, j'ai mis un exemple avec un Plan, ainsi que l'analyse de la macro (si je ne me suis pas trompé), tel que je la souhaite.

Si quelqu'un pouvait me traduire la langue usuelle de l'analyse en syntaxe VBA, je serais comblé.
Ce sera pour moi un premier pas dans le monde des macros !
 

Pièces jointes

  • DoubleClicPlanV5.zip
    8.9 KB · Affichages: 93

hoerwind

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Salut job,

Merci pour le lien, je n'avais pas suivi ce fil.

Tes propositions se rapprochent fort de ce que je souhaites réaliser, à quelques différences près toutefois :
- Au lieu de cliquer sur le "+" ou le "-" je souhaite double-cliquer directement sur le nom de la section, ou de la sous-section ou de la sous-sous-section, donc la macro doit repérer si la section est ouverte ou fermée (le principe retenu par JB).
- Il s'agit d'une ouverture ou fermeture en cascade (trois niveaux), basée sur le nombre de caractères du code.
- Un masquage des lignes serait suffisant, de sorte que chaque ligne conserve son adresse, bien utile pour créer des liens.

Edition :
Oublié de préciser, mais tu l'auras probablement remarqué : tout se passe sur la même feuille.
Donc simplement (façon de parler) remplacer les "+" et "-" du Plan (marge de gauche) par des double-clic.
Crois-tu que ce soit faisable pour une BD de plus de 1000 lignes ?
Si tu désires un exemple plus étoffé, pas de problème, je puis te fournir un exemple d'une centaine de lignes.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Créer une table de matières dynamique

Re hoerwind,

Avec des - ou des + comme repères en colonne B, c'est facile.

Et je pense que tu comprendras aisément la macro :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim derlig As Long, lig As Long, n As Byte
derlig = Application.Match(Chr(255), [A:A])
If Intersect(Target, Range("A1:A" & derlig)) Is Nothing Then Exit Sub
Application.ScreenUpdating = False
Cancel = True
lig = Target.Row + 1
n = Len(Target)
If Target.Offset(, 1) = "-" Then
  Target.Offset(, 1) = "+"
  While Len(Cells(lig, 1)) > n And lig <= derlig
    Rows(lig).Hidden = True
    Cells(lig, 2) = "+"
    lig = lig + 1
  Wend
Else
  Target.Offset(, 1) = "-"
  While Len(Cells(lig, 1)) > n And lig <= derlig
    If Len(Cells(lig, 1)) = n + 1 Then Rows(lig).Hidden = False
    lig = lig + 1
  Wend
End If
End Sub

A+
 

Pièces jointes

  • Arborescence(1).xls
    33.5 KB · Affichages: 165

Discussions similaires

Statistiques des forums

Discussions
312 571
Messages
2 089 809
Membres
104 278
dernier inscrit
LENZY