> Tous les forums > Forum Bureautique
 tri de donnéesSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
maxilaure
  Posté le 19/06/2019 @ 19:19 
Aller en bas de la page 
Petit astucien

bonjour,

dans le fichier EXCEL ci-joint, des lignes sont groupées (lignes vertes) à la ligne rose. Les cellules rouges sont verrouillées et masquées pour pouvoir être protégées lorsque j'active la protection de la feuille car elle ne doivent pas être modifiable en utilisation.

Le problème est que lorsque cette protection de feuille est active, je ne peux plus agir sur les "+" et "-" de l’arborescence de données à gauche.

La solution trouvée est la création de 2 macros qui restent actives durant la protection de la feuille : une pour tout faire apparaître et l'autre pour tout masquer.

https://www.cjoint.com/c/IFtrquzjBfo

Mon problème est que je n'arrive pas à rendre visible qu'une seule arborescence, je voudrais rendre visible seulement la ligne choisi (A ou B dans le fichier)

mais eut-être existe-t'il une solution alternative aux macros?

Merci de votre aide

Publicité
Debrief
 Posté le 19/06/2019 à 21:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Hors macros, point de salut. D'ailleurs le fichier que tu donnes en exemple n'en contient pas, donc on ne sait pas trop...

Si la feuille est protégée, je ne vois pas ce que tu peux faire car que ce soit manuellement ou en VBA (erreur 400), il n'est pas possible d'agir sur les "+" et "-" du groupage.
Je n'ai pas compris ton affaire de "macros qui restent actives durant la protection de la feuille". Je suppose que tu veux grouper et dégrouper en VBA (?) en gérant la protection / dé-protection dans le code.

Le groupage n'est pas couvert dans le détail par le VBA et donc pour ne dégrouper qu'un groupe du niveau (1), il faut dégrouper tous les groupes du niveau (1) puis cacher tous les groupes du niveau (1) non concernés.
Ce qui implique (inconvénient !) de les prédéfinir soit en Gestionnaire de Noms soit en constantes (comme dans l'exemple ci-dessous) pour y faire référence. A moins que la logique des données de la feuille n'en permette une définition dynamique.

Private Const RowsGroupA = "7:14"
Private Const RowsGroupB = "16:22"
Private Const LevelGroups = 1
Private Const MotDePasse = ""


Sub ShowGroupAOnly()
Call ShowGroupOnly(RowsGroupA)
End Sub

Sub ShowGroupBOnly()
Call ShowGroupOnly(RowsGroupB)
End Sub

Private Sub ShowGroupOnly(RowsGroup As String)
Dim Line As Range

Application.ScreenUpdating = False
ActiveSheet.Unprotect (MotDePasse)


'Dégroupe tous les groupes de niveau 1
ActiveSheet.Outline.ShowLevels RowLevels:=LevelGroups + 1

'Regroupe tous les groupes de niveau 1 n'appartenant pas au Groupe demandé
For Each Line In ActiveSheet.Rows(ActiveSheet.UsedRange.Row & ":" & ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1)
If Line.OutlineLevel > LevelGroups And Intersect(ActiveSheet.Rows(RowsGroup), Line) Is Nothing Then Line.Hidden = True
Next Line

ActiveSheet.Protect (MotDePasse)
Application.ScreenUpdating = True
End Sub

Cordialement,
D.



Modifié par Debrief le 19/06/2019 21:56
maxilaure
 Posté le 19/06/2019 à 21:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

mince je viens effectivement de m'apercevoir que les macros avaient "disparu"

Je modifie le fichier demain et je le remets en ligne avec plus(+) d'information à l'intérieur afin de mieux visualiser ce que je souhaite et ce que j'ai déjà fait

Je n'ai pas compris ton affaire de "macros qui restent actives durant la protection de la feuille". Je suppose que tu veux grouper et dégrouper en VBA (?) en gérant la protection / dé-protection dans le code.

En fait je veux parler des boutons(visuel et masquer)qui restent accessibles alors que le groupage dégroupage ne l'est plus. Effectivement il s'agit de groupage/dégroupage en VBA et oui aussi pour la protection/dé-protection dans le code

Debrief
 Posté le 19/06/2019 à 21:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ou alternativement pour ne dégrouper qu'un groupe du niveau (1), il faut cacher tous les groupes du niveau (1) non concernés et démasquer le groupe du niveau (1) concerné

Private Sub ShowGroupOnly(RowsGroup As String)
Dim Line As Range

Application.ScreenUpdating = False
ActiveSheet.Unprotect (MotDePasse)

'Masque les groupes de niveau 1 n'appartenant pas au Groupe demandé, démasque le groupe demandé
For Each Line In ActiveSheet.Rows(ActiveSheet.UsedRange.Row & ":" & ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1)
If Line.OutlineLevel > LevelGroups And Intersect(ActiveSheet.Rows(RowsGroup), Line) Is Nothing Then Line.Hidden = True Else Line.Hidden = False
Next Line

ActiveSheet.Protect (MotDePasse)
Application.ScreenUpdating = True
End Sub



Modifié par Debrief le 19/06/2019 21:59
Debrief
 Posté le 19/06/2019 à 22:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

OK, après ta confirmation, j'ai ajouté la gestion de la protection de la feuille en rouge dans le code.

maxilaure
 Posté le 20/06/2019 à 18:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Voilà le fichier est modifié et normalement les macros que j'ai fait fonctionnent

https://www.cjoint.com/c/IFuqo6HTI8o

Merci de votre aide à nouveau

Debrief
 Posté le 20/06/2019 à 19:40 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

OK pour le fichier. Tu as lu mes réponses d'hier ou pas encore ?

maxilaure
 Posté le 20/06/2019 à 20:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Oui j'ai lu les réponses mais pas essayé. Ma priorité était de mettre le bon fichier en ligne 😉

Je prends le temps dans la soirée

maxilaure
 Posté le 20/06/2019 à 21:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

XXXXX IL MANQUE QUELQUE CHOSE ICI CAR CA BLOQUE xxxx

Private Sub ShowGroupOnly(RowsGroup As String)

Dim Line As RangeApplication.ScreenUpdating = FalseActiveSheet.Unprotect (MotDePasse)'Masque les groupes de niveau 1 n'appartenant pas au Groupe demandé, démasque le groupe demandéFor Each Line In ActiveSheet.Rows(ActiveSheet.UsedRange.Row & ":" & ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1)If Line.OutlineLevel > LevelGroups And Intersect(ActiveSheet.Rows(RowsGroup), Line) Is Nothing Then Line.Hidden = True Else Line.Hidden = FalseNext LineActiveSheet.Protect (MotDePasse)Application.ScreenUpdating = TrueEnd Sub

Publicité
Debrief
 Posté le 20/06/2019 à 22:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

C'est une 2ème version de la fonction citée dans le message précédent, message qui contient les éléments d'appel de cette fonction.

https://www.cjoint.com/c/IFuupuZh0NV

maxilaure
 Posté le 20/06/2019 à 22:29 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

ok je comprends mieux avec le fichier joint.

Donc à la lecture du VGA, je comprends qu'il faut identifier les groupes et les lignes de chaque groupe donc cela veut dire que si l'on insère des lignes supplémentaires, il faut modifier le programme. et là c'est pas top car l'automatisme recherché ne l'est plus

maxilaure
 Posté le 20/06/2019 à 22:34 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

en fait il ne faudrait pas avoir à changer le "programme" si l'on insère des lignes dans le groupe A et/ou le groupe B

Debrief
 Posté le 21/06/2019 à 00:34 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Il existe une méthode pour identifier dynamiquement les groupes qui consiste à examiner les lignes de la feuille et leur .OutlineLevel.

Cette approche ne nécessite pas d'exploiter une présentation spéciale des données pour identifier les groupes.

Dans cet examen des lignes on va donc trouver des groupes qu'on identifiera par le numéro d'ordre (1, 2, ...), et c'est ce numéro qui sera utilisé pour les afficher spécifiquement.

Edit: une version pour gérer des groupes imbriqués -> https://www.cjoint.com/c/IFvrclOxNGM



Modifié par Debrief le 21/06/2019 19:02
maxilaure
 Posté le 21/06/2019 à 19:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

essai validé et j'ai réussi à augmenter le nombre de groupe en l'augmentant à 5 pour le moment et surement à 10 voire 12 à l'avenir.

Quand je vois la complexité des formules, j'y aurai passé un bon moment pour final sûrement baisser les bras.

Un grand merci Debrief.

Debrief
 Posté le 21/06/2019 à 19:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

OK, dans la dernière version de 19h02, pas de modif fonctionnelle, j'ai juste déplacé le masquage préalable des groupes en paramètre de la fonction d'affichage d'un groupe spécifique pour être plus explicite.

Dans un monde idéal, pour rendre l'appel au fonctions complètement indépendant de la structure des groupes, on pourrait reproduire cette structure dans un Userform et y gérer leur masquage / démasquage.
Mais ça c'est si seulement Lætitia Casta ou Marion Cotillard le demande

Cordialement,
D.

maxilaure
 Posté le 21/06/2019 à 20:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Wouah de mieux en mieux

J'essaie dès que possible

Debrief
 Posté le 21/06/2019 à 21:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Si tu as 10 ou 12 groupes, ça va devenir difficile de gérer des boutons pour chacun de ces groupes.

Je te propose une autre approche facile qui consiste à double-cliquer sur les lignes d'entêtes des groupes pour les grouper ou les dégrouper selon leur état dans la feuille.

Il faut intercepter le double-clic sur la feuille et appeler la fonction qui gère ça. Très simple !

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = ManageGroupedLines(Me, Target)
End Sub

https://www.cjoint.com/c/IFvtyrxCdYM

Edit: J'ai supprimé mon message précédent qui incluait un fichier demandant des boutons au lieu du double-clic beaucoup plus simple.



Modifié par Debrief le 21/06/2019 21:29
Publicité
maxilaure
 Posté le 21/06/2019 à 21:34 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Le nouveau lien vers le fichier tient compte de cette modification inscrite en vert ?

Debrief
 Posté le 21/06/2019 à 21:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Oui, c'est dedans. C'est juste une info indiquant qu'il faut faire cet ajout sur le code de la ou des feuilles concernées pour faire marcher ce système de groupage / dégroupage.

maxilaure
 Posté le 21/06/2019 à 22:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Super vivement que j'essaie

maxilaure
 Posté le 22/06/2019 à 11:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

ESSAI VALIDE

Le double-click facilite et simplifie tout

L'ergonomie est vraiment améliorée et tout devient plus simple

reste plus qu'à insérer la protection de la feuille dans la version finale.



Modifié par maxilaure le 22/06/2019 11:42
Debrief
 Posté le 22/06/2019 à 13:30 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

La protection est intégrée.

Faut juste adapter le mot de passe dans la constante si le mot de passe est non vide.



Modifié par Debrief le 22/06/2019 13:34
maxilaure
 Posté le 24/06/2019 à 21:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour Debrief,

j'ai essayé sur un ordinateur au boulot et le double-clic ne fonctionne pas.

et sinon est-ce que la colonne avec les chiffres indiquant les niveaux est importante ou non?

merci de l'aide

Debrief
 Posté le 24/06/2019 à 22:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Non, la colonne avec les niveaux est juste là à titre de test pour illustrer les imbrications et n'a aucune utilité.

Si le double-clic ne fonctionne pas c'est que tu n'as pas mis les lignes de code SUR LA (LES) FEUILLE(S) CONCERNÉE(S) qui interceptent le double-clic comme indiqué sur mon post du 21/06/2019 à 21:28.



Modifié par Debrief le 24/06/2019 22:51
maxilaure
 Posté le 24/06/2019 à 23:01 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Je viens de trouver, ouf

Je récupère les infos pour mettre sur l'ordinateur su boulot et je vois si ça fonctionne mercredi

Demain c'est repos

Je vous tiens au courant

Merci

Publicité
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
[Interdire une validation de données selon une autre cellule]
comment avoir les données du haut d'un tableau à double entrée sur chaque p
supprimer des lignes dans une base de données pour des doublons
Excel - figer le cadre mais pas les données
Base de données Access 2007 illisible
VBA Excel Liste validation des données
Utiliser un TCD comme base de données
Excel Onglet Données/Feuille de prévision grisé
Créer une base de données pour l'immobilier
Macro pour copie de données selon critère
Plus de sujets relatifs à tri de données
 > Tous les forums > Forum Bureautique