Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

groupement de lignes (plan) - HELP

7 réponses
Avatar
Jean-François LEGRAS
Bonjour,

C'est horrible !! Je n'arrive pas à trouver la solution à mon problème. Plus
d'une journée à me prendre la tête, je crois que mon cerveau est en
surchauffe et je m'en remets donc à votre expertise (bien plus grande que la
mienne) pour m'aider...

Voici le problème : je souhaiterais grouper automatiquement des lignes
(plan) en fonction de 2 critères (cf fichier
tp://cjoint.com/?dittoKPr4O ) :

tout d'abord :

1) grouper les lignes entre chaque compte de Niv2 (à l'exclusion des lignes
comportant ces comptes de Niv2). A priori la première partie de ma macro
fonctionne.

2) Ensuite grouper les lignes entre chaque compte de Niv3 SAUF si entre ces
2 lignes se trouve un (ou plusieurs) compte(s) de Niv2. Auquel cas, les
lignes à grouper sont celles entre la ligne en-dessous du compte de Niv3 le
plus haut des 2 jusqu'à la ligne au-dessus du compte de Niv2 (le plus haut
s'il y en a plusieurs) et la ligne. Je ne sais pas si je suis très clair,
mais en tous cas, le résultat à obtenir est celui du fichier joint (je l'ai
fait à la mano...). Il s'agit d'avoir une vision en plan d'une hiérarchie
(je pense que vous aurez saisi la logique en regardant le fichier et en
jouant avec les +,-,1,2,3).


La 2ème partie de la macro fonctionne presque mais pour une raison que je ne
saisis pas elle fait un dernier regroupement de l'ensemble des lignes...



Enfin, le fin du fin serait de faire la même chose pour les comptes de Niv
4, mais alors là j'ai carrément eu peur que ma tête explose : il s'agit dans
TOUS LES CAS DE FIGURES, de grouper les comptes de niv 4 enter eux sauf si
entre ces lignes se trouvent un compte de Niv2 ou un compte de Niv 3. Trop
dur pour mon tout petit QI...


Bon en tous cas, un immense merci d'avance à vous pour vous pencher sur mon
problème et je l'espère trouver la solution !!

Excellente soirée et excellent week-end !

JF

7 réponses

Avatar
francois.forcet
Salut Jean François

Essaies ce code en adaptant le paramètre Colonne en fonction de la
colonne à traiter :

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 3
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Répètes le code à la suite pour chaque colonne en n'oubliant pas
d'actualiser le paramètre Colonne

Si ton code aboutissait à un regroupement de lignes c'est en raison de
l'instruction en fin :

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

Je ne l'ai pas utilisé dans ma proposition ne sachant pas ce que tu
recherchais avec

Fais des essais et dis moi !!!!
Avatar
Jean-François LEGRAS
Bonjour et merci beaucoup François !!

Le code est hyper intéressant et je vais le potasser pour le comprendre.
Malheureusement, il ne répond qu'à la première partie du problème, celle que
j'avais réussi à résoudre.

En effet en mettant colonne C, ca marche ca groupe bien les lignes entre les
comptes de niv2. Par conter, si je mets colonne D, là, ca ne résoud pas le
fameux problème des comptes de Niv2 qui sse trouvent entre les comptes de
Niv3.


Pour ta question sur le code ActiveSheet.Outline.ShowLevels RowLevels:=1,
ColumnLevels:=1, c'est juste qu'à la fin je ferme le plan afin d'offrir une
visibilité dus les comptes de Niv2 (mais vraiment c'est un détail de la
macro, il s'agit de mettre ça uniquement à la fin...).

Si tu as la réponse pour mon pb des colonnes D & E, je suis preneur...

A+

JF


a écrit dans le message de news:

Salut Jean François

Essaies ce code en adaptant le paramètre Colonne en fonction de la
colonne à traiter :

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 3
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Répètes le code à la suite pour chaque colonne en n'oubliant pas
d'actualiser le paramètre Colonne

Si ton code aboutissait à un regroupement de lignes c'est en raison de
l'instruction en fin :

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

Je ne l'ai pas utilisé dans ma proposition ne sachant pas ce que tu
recherchais avec

Fais des essais et dis moi !!!!
Avatar
francois.forcet
On 9 mar, 01:17, "Jean-François LEGRAS" wrote:
Bonjour et merci beaucoup François !!

Le code est hyper intéressant et je vais le potasser pour le comprendre.
Malheureusement, il ne répond qu'à la première partie du problème, celle que
j'avais réussi à résoudre.

En effet en mettant colonne C, ca marche ca groupe bien les lignes entre l es
comptes de niv2. Par conter, si je mets colonne D, là, ca ne résoud pa s le
fameux problème des comptes de Niv2 qui sse trouvent entre les comptes d e
Niv3.

Pour ta question sur le code ActiveSheet.Outline.ShowLevels RowLevels:=1 ,
ColumnLevels:=1, c'est juste qu'à la fin je ferme le plan afin d'offri r une
visibilité dus les comptes de Niv2 (mais vraiment c'est un détail de l a
macro, il s'agit de mettre ça uniquement à la fin...).

Si tu as la réponse pour mon pb des colonnes D & E, je suis preneur...

A+

JF

a écrit dans le message de news:

Salut Jean François

Essaies ce code en adaptant le paramètre Colonne en fonction de la
colonne à traiter :

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 3
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Répètes le code à la suite pour chaque colonne en n'oubliant pas
d'actualiser le paramètre Colonne

Si ton code aboutissait à un regroupement de lignes c'est en raison de
l'instruction en fin :

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

Je ne l'ai pas utilisé dans ma proposition ne sachant pas ce que tu
recherchais avec

Fais des essais et dis moi !!!!


Rebonjours Jean François

Si tu veux résoudre la 2° partie de ta problématique à savoir colonn e
D regrouper les niveau 3 en tenant compte de la colonne C niveau 2 il
suffit d'abord de regrouper les niveaux 2 colonne C puis les niveaux 3
colonne D
Si tu as regrouper les niveaux 2 colonnes C le regroupement des
niveaux 3 colonne D se fait pour tous ce qui n'a pas été regroupé en
niveau 2 colonne C donc prend en compte les niveaux 2 dans son
regroupement par voie de conséquence

Essaies de regrouper d'abords les niveaux 2 colonne C puis les niveaux
3 colonne D
Tu dois avoir le même résultat que moi à savoir le regroupement en
colonne D des seules lignes qui n'ont pas été pris en compte dans le
regroupement des niveaux 2 colonne C

N'est ce pas ce que tu souhaites ????

Idem pour la colonne E il faut opérer les regroupements Niveau 2 et
niveau 3 colonnes C et D avant le niveau 4 colonne E

Testes le et dis moi !!!!!

Avatar
Jean-François LEGRAS
Bonjour François,


Merci encore pour ta réponse !


Je reprécise mes pensées :

En fait, je souhaiterais avoir un plan comme suit :

1) lorsqu'il est refermé, je n'ai que le compte leader et les comptes de
Niv2 qui soient visibles ;
2) puis en le dépliant sur le 2ème niveau (click du "2" en haut à gauche),
j'ai le leader, les comptes de niv 2 et les comptes de niv 3 qui soient
visibles ;
3) puis, en le dépliant sur le 3ème niveau (click "3"), j'ai le leader, les
comptes de niv 2, 3 et 4 qui soient visibles.
4) enfin, en le dépliant complètement (click "4"), j'ai tous les comptes de
la hiérarchie.

Et ce dans tous les cas de figure (que des comptes de niv supérieur
s'interposent ou non entre des comptes de niv inférieur).



En suivant tes conseils, j'ai écrit la macro suivante :



Colonne = "C"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop




=> Et j'arrive en effet à un résultat intéressant pas très éloigné de ce que
j'aimerais obtenir :

- Mon point N° 2 est bien atteint (les comptes de Niv 3 sont groupés entre
eux).
- Par contre, mon point N° 1 n'est pas atteint : la dernière ligne est
regroupée directement avec la ligne 6. Je n'ai donc pas les comptes de Niv
2 groupés entre eux.




Enfin, si j'ajoute le code :


Colonne = "E"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop



=> J'obtiens mon point 3 (regroupement des comptes de niv 4 avec click
"3" ), mais mon point 2 a disparu et le point 1 reste non atteint (cette
fois-ci la dernière ligne est groupée avec la ligne 5).


Bref, je n'ai qu'une partie de la solution mais pas la solution dans sa
globalité.


En espérant que tout ce que j'écris est clair et compréhensible...


Merci d'avance !

JF





a écrit dans le message de news:

On 9 mar, 01:17, "Jean-François LEGRAS" wrote:
Bonjour et merci beaucoup François !!

Le code est hyper intéressant et je vais le potasser pour le comprendre.
Malheureusement, il ne répond qu'à la première partie du problème, celle
que
j'avais réussi à résoudre.

En effet en mettant colonne C, ca marche ca groupe bien les lignes entre
les
comptes de niv2. Par conter, si je mets colonne D, là, ca ne résoud pas le
fameux problème des comptes de Niv2 qui sse trouvent entre les comptes de
Niv3.

Pour ta question sur le code ActiveSheet.Outline.ShowLevels RowLevels:=1,
ColumnLevels:=1, c'est juste qu'à la fin je ferme le plan afin d'offrir
une
visibilité dus les comptes de Niv2 (mais vraiment c'est un détail de la
macro, il s'agit de mettre ça uniquement à la fin...).

Si tu as la réponse pour mon pb des colonnes D & E, je suis preneur...

A+

JF

a écrit dans le message de news:

Salut Jean François

Essaies ce code en adaptant le paramètre Colonne en fonction de la
colonne à traiter :

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 3
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Répètes le code à la suite pour chaque colonne en n'oubliant pas
d'actualiser le paramètre Colonne

Si ton code aboutissait à un regroupement de lignes c'est en raison de
l'instruction en fin :

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

Je ne l'ai pas utilisé dans ma proposition ne sachant pas ce que tu
recherchais avec

Fais des essais et dis moi !!!!


Rebonjours Jean François

Si tu veux résoudre la 2° partie de ta problématique à savoir colonne
D regrouper les niveau 3 en tenant compte de la colonne C niveau 2 il
suffit d'abord de regrouper les niveaux 2 colonne C puis les niveaux 3
colonne D
Si tu as regrouper les niveaux 2 colonnes C le regroupement des
niveaux 3 colonne D se fait pour tous ce qui n'a pas été regroupé en
niveau 2 colonne C donc prend en compte les niveaux 2 dans son
regroupement par voie de conséquence

Essaies de regrouper d'abords les niveaux 2 colonne C puis les niveaux
3 colonne D
Tu dois avoir le même résultat que moi à savoir le regroupement en
colonne D des seules lignes qui n'ont pas été pris en compte dans le
regroupement des niveaux 2 colonne C

N'est ce pas ce que tu souhaites ????

Idem pour la colonne E il faut opérer les regroupements Niveau 2 et
niveau 3 colonnes C et D avant le niveau 4 colonne E

Testes le et dis moi !!!!!

Avatar
Jean-François LEGRAS
Bonjour François,


Merci encore pour ta réponse !


Je reprécise mes pensées :

En fait, je souhaiterais avoir un plan comme suit :

1) lorsqu'il est refermé, je n'ai que le compte leader et les comptes de
Niv2 qui soient visibles ;
2) puis en le dépliant sur le 2ème niveau (click du "2" en haut à gauche),
j'ai le leader, les comptes de niv 2 et les comptes de niv 3 qui soient
visibles ;
3) puis, en le dépliant sur le 3ème niveau (click "3"), j'ai le leader, les
comptes de niv 2, 3 et 4 qui soient visibles.
4) enfin, en le dépliant complètement (click "4"), j'ai tous les comptes de
la hiérarchie.

Et ce dans tous les cas de figure (que des comptes de niv supérieur
s'interposent ou non entre des comptes de niv inférieur).



En suivant tes conseils, j'ai écrit la macro suivante :



Colonne = "C"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop




=> Et j'arrive en effet à un résultat intéressant pas très éloigné de ce que
j'aimerais obtenir :

- Mon point N° 2 est bien atteint (les comptes de Niv 3 sont groupés entre
eux).
- Par contre, mon point N° 1 n'est pas atteint : la dernière ligne est
regroupée directement avec la ligne 6. Je n'ai donc pas les comptes de Niv
2 groupés entre eux.




Enfin, si j'ajoute le code :


Colonne = "E"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop



=> J'obtiens mon point 3 (regroupement des comptes de niv 4 avec click
"3" ), mais mon point 2 a disparu et le point 1 reste non atteint (cette
fois-ci la dernière ligne est groupée avec la ligne 5).


Bref, je n'ai qu'une partie de la solution mais pas la solution dans sa
globalité.


En espérant que tout ce que j'écris est clair et compréhensible...


Merci d'avance !

JF


a écrit dans le message de news:

On 9 mar, 01:17, "Jean-François LEGRAS" wrote:
Bonjour et merci beaucoup François !!

Le code est hyper intéressant et je vais le potasser pour le comprendre.
Malheureusement, il ne répond qu'à la première partie du problème, celle
que
j'avais réussi à résoudre.

En effet en mettant colonne C, ca marche ca groupe bien les lignes entre
les
comptes de niv2. Par conter, si je mets colonne D, là, ca ne résoud pas le
fameux problème des comptes de Niv2 qui sse trouvent entre les comptes de
Niv3.

Pour ta question sur le code ActiveSheet.Outline.ShowLevels RowLevels:=1,
ColumnLevels:=1, c'est juste qu'à la fin je ferme le plan afin d'offrir
une
visibilité dus les comptes de Niv2 (mais vraiment c'est un détail de la
macro, il s'agit de mettre ça uniquement à la fin...).

Si tu as la réponse pour mon pb des colonnes D & E, je suis preneur...

A+

JF

a écrit dans le message de news:

Salut Jean François

Essaies ce code en adaptant le paramètre Colonne en fonction de la
colonne à traiter :

Colonne = "D"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 3
If ActiveCell = "" Then
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Activate
Selection.Group
Else
If ActiveCell.Offset(-1, 0) <> "" Then
ActiveCell.End(xlUp).Activate
End If
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Répètes le code à la suite pour chaque colonne en n'oubliant pas
d'actualiser le paramètre Colonne

Si ton code aboutissait à un regroupement de lignes c'est en raison de
l'instruction en fin :

ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1

Je ne l'ai pas utilisé dans ma proposition ne sachant pas ce que tu
recherchais avec

Fais des essais et dis moi !!!!


Rebonjours Jean François

Si tu veux résoudre la 2° partie de ta problématique à savoir colonne
D regrouper les niveau 3 en tenant compte de la colonne C niveau 2 il
suffit d'abord de regrouper les niveaux 2 colonne C puis les niveaux 3
colonne D
Si tu as regrouper les niveaux 2 colonnes C le regroupement des
niveaux 3 colonne D se fait pour tous ce qui n'a pas été regroupé en
niveau 2 colonne C donc prend en compte les niveaux 2 dans son
regroupement par voie de conséquence

Essaies de regrouper d'abords les niveaux 2 colonne C puis les niveaux
3 colonne D
Tu dois avoir le même résultat que moi à savoir le regroupement en
colonne D des seules lignes qui n'ont pas été pris en compte dans le
regroupement des niveaux 2 colonne C

N'est ce pas ce que tu souhaites ????

Idem pour la colonne E il faut opérer les regroupements Niveau 2 et
niveau 3 colonnes C et D avant le niveau 4 colonne E

Testes le et dis moi !!!!!

Avatar
francois.forcet
Rebonjours Jean François

essaies ce code je pense qu'il devrait convenir

Colonne = "C"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
Départ = ActiveCell.Address
Do While ActiveCell = "" And ActiveCell.End(xlToLeft).Address =
Range("A" & ActiveCell.Row).Address
ActiveCell.Offset(-1, 0).Activate
Loop
If Départ <> ActiveCell.Address Then
Range(Départ, ActiveCell.Offset(1, 0)).EntireRow.Activate
Selection.Group
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Actualise le paramètre "Colonne" de la colonne à traiter
Pour traiter toute les colonnes répètes ce code en n'oubliant pas
d'actualiser le para mètre "Colonne" à chaque fois

Donnes moi tes impressions !!!!
Avatar
Jean-François LEGRAS
GENIAL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



MERCI BEAUCOUP FRANCOIS !!!!!!!!!



C'est vraiment fantastique !!! Ca marche parfaitement !!!

Et désolé mille fois pour avoir reposté, je me disais que tu avais peut-être
abandonné...

Bon maintenant, il va falloir que je me pose sérieusement et essaie de
comprendre ce code magique et là c'est pas gagné ;-)


Merci encore !

A+

JF



a écrit dans le message de news:

Rebonjours Jean François

essaies ce code je pense qu'il devrait convenir

Colonne = "C"
Range(Colonne & Range("A65535").End(xlUp).Row).Select
Do While ActiveCell.Row > 6
Départ = ActiveCell.Address
Do While ActiveCell = "" And ActiveCell.End(xlToLeft).Address Range("A" & ActiveCell.Row).Address
ActiveCell.Offset(-1, 0).Activate
Loop
If Départ <> ActiveCell.Address Then
Range(Départ, ActiveCell.Offset(1, 0)).EntireRow.Activate
Selection.Group
End If
Range(Colonne & ActiveCell.Offset(-1, 0).Row).Activate
Loop

Actualise le paramètre "Colonne" de la colonne à traiter
Pour traiter toute les colonnes répètes ce code en n'oubliant pas
d'actualiser le para mètre "Colonne" à chaque fois

Donnes moi tes impressions !!!!