XL 2021 masquage de ligne selon condition

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

philkowa

XLDnaute Nouveau
Supporter XLD
Bonjour
Je suis prof en milieu carcéral.
Ce fichier est un registre d'appel pour des élèves amenés à entrer en formation et à en sortir à des dates différentes.
La feuille données élèves regroupe tous les élèves, leur groupe, leur date d'entrée et leur date de sortie
Dans le fichier d'origine, grâce à la fonction FILTER (version excel récente au boulot, que je n'ai pas sur mon pc maison!), les noms et prénoms sont dispatchés dans les feuilles groupe, en fonction des colonnes A, B et C de la feuille données élèves et de la cellule B3 de chaque feuille groupe. Cette nouvelle fonction fonctionne très bien...
Ma question concerne les élèves partis: Comment faire pour que, quand la colonne E de la feuille données élèves contient une date, ce qui signifie que l'élève est parti, la ligne correspondant à cet élève se masque dans le groupe concerné (ex nom2 groupe1 et nom6 groupe4; j'ai surligné les noms)
Il doit bien exister une macro?
Merci!!!
 

Pièces jointes

Solution
Bonsoir tout le monde,
Un nouvel essai en PJ avec cette unique macro à mettre dans ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, i%, Nom$, Prenom$, Groupe$, Tablo
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row       ' Dernière ligne du tableau des élèves
        Tablo = .Range("A2:G" & DL)                             ' Recup tableau élèves dans un array
    End With
    If Left([A1], 5) <> "Année" Then Exit Sub                   ' On sort si en A1 on n'a pas "Année"
    Groupe = [D3]                                               ' Recup du groupe de la feuille
    Cells.EntireRow.Hidden = False...
Bonjour philkowa et bienvenu sur XLD,
Un essai en PJ avec une macro dans Thisworkbook.
Cette macro est activé automatiquement lorsqu'on sélectionne une feuille dont le nom commence par "gr".
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, Nom$, Sortie
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row
        Set Plage = .Range("A2:F" & DL)                         ' Recup Plage élèves
    End With
    If LCase(Left(Sh.Name, 2)) = "gr" Then
        DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row         ' dernière ligne
        For L = 6 To DL
            Nom = Cells(L, "A")                                 ' Recup nom de l'élève
            Sortie = Application.VLookup(Nom, Plage, 5, 0)      ' Recup date de sortie
            If Sortie <> 0 Then Rows(L).EntireRow.Hidden = True ' Si date de sortie on masque la ligne
        Next L
    End If
End Sub
 

Pièces jointes

Re,
Plus simple et plus rapide
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, Nom$, Sortie, Plage
    If LCase(Left(Sh.Name, 2)) <> "gr" Then Exit Sub
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row   ' Dernière lignes de la liste élèves
        Set Plage = .Range("A2:F" & DL)                     ' Recup Plage élèves
    End With
    DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row         ' Dernière ligne
    For L = 6 To DL                                         ' Pour chaque ligne non vide
        Nom = Cells(L, "A")                                 ' Recup nom de l'élève
        Sortie = Application.VLookup(Nom, Plage, 5, 0)      ' Recup date de sortie
        If Sortie <> 0 Then Rows(L).EntireRow.Hidden = True ' Si date de sortie on masque la ligne
    Next L
End Sub
 

Pièces jointes

Re,
Plus simple et plus rapide
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, Nom$, Sortie, Plage
    If LCase(Left(Sh.Name, 2)) <> "gr" Then Exit Sub
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row   ' Dernière lignes de la liste élèves
        Set Plage = .Range("A2:F" & DL)                     ' Recup Plage élèves
    End With
    DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row         ' Dernière ligne
    For L = 6 To DL                                         ' Pour chaque ligne non vide
        Nom = Cells(L, "A")                                 ' Recup nom de l'élève
        Sortie = Application.VLookup(Nom, Plage, 5, 0)      ' Recup date de sortie
        If Sortie <> 0 Then Rows(L).EntireRow.Hidden = True ' Si date de sortie on masque la ligne
    Next L
End Sub



Bonjour
Ca fonctionne mais quand j'ouvre le fichier que vous m'avez gentiment renvoyé, je ne trouve pas la macro...? quand j'ouvre la fenêtre de dialogue des macros elle n'apparait pas... (j'ai bien débloqué le fichier pour que la macro fonctionne)
Il faudra que je colle le code dans le fichier du boulot? Les noms de groupes sont différente dans les feuilles du fichier du boulot( Alpha, FLE, informatique...)
Merci
 
Bonjour à tous

@philkowa je te propose ce fichier

A noter mon fichier fonctionne même si tu as 2 noms identiques (Durand par exemple) car il recherche le nom + le prénom de la personne .
Mais si tu as 2 Jean Durand les 2 se retrouveront masqués si tu ne veux pas cela il faut une clé d'identification unique et indiscutable. 😉

Merci de ton retour
 

Pièces jointes

Re,
Un essai en PJ avec une macro dans Thisworkbook
1762438519144.png
 
Bonjour

Avec PowerQuery il serait très simple de générer tout cela...

2021 a la fonction FILTRE. C'est ta version perso ou boulot ? Sinon tu as laquelle ?
Bonjour
Au boulot j'ai la version 2021 qui accepte la fonction FILTER, mais à la maison je n'ai pour l'instant que la version 2013
Merci
Re,
Plus simple et plus rapide
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, Nom$, Sortie, Plage
    If LCase(Left(Sh.Name, 2)) <> "gr" Then Exit Sub
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row   ' Dernière lignes de la liste élèves
        Set Plage = .Range("A2:F" & DL)                     ' Recup Plage élèves
    End With
    DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row         ' Dernière ligne
    For L = 6 To DL                                         ' Pour chaque ligne non vide
        Nom = Cells(L, "A")                                 ' Recup nom de l'élève
        Sortie = Application.VLookup(Nom, Plage, 5, 0)      ' Recup date de sortie
        If Sortie <> 0 Then Rows(L).EntireRow.Hidden = True ' Si date de sortie on masque la ligne
    Next L
End Sub
j'ai trouvé le code dans virtual basic!!
Je voulais vous envoyer le fichier d'origine (sans les noms de détenus) mais il est trop volumineux!
y a t il un autre moyen de vous l'envoyer?
Merci
Dans ce cas comment différentier les pages à traiter ?
Est qu'il y a une feuille nommée "données élèves" dans votre fichier ?
Ou y a t-il dans les feuilles à traiter en A3 : "groupe" ?
Chaque feuille de groupe a son nom (nom de la feuille et en cellule B3
La feuille données élèves regroupe tous les élèves.
Un nouveau malotru manifestement...
pardon?
Bonjour à tous

@philkowa je te propose ce fichier

A noter mon fichier fonctionne même si tu as 2 noms identiques (Durand par exemple) car il recherche le nom + le prénom de la personne .
Mais si tu as 2 Jean Durand les 2 se retrouveront masqués si tu ne veux pas cela il faut une clé d'identification unique et indiscutable. 😉

Merci de ton retour
Bonjour
Merci
j'ai téléchargé et débloqué votre fichier, mais il ne fonctionne pas... Le bouton ne semble pas avoir d'effet... :-(
Re,
Plus simple et plus rapide
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, Nom$, Sortie, Plage
    If LCase(Left(Sh.Name, 2)) <> "gr" Then Exit Sub
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row   ' Dernière lignes de la liste élèves
        Set Plage = .Range("A2:F" & DL)                     ' Recup Plage élèves
    End With
    DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row         ' Dernière ligne
    For L = 6 To DL                                         ' Pour chaque ligne non vide
        Nom = Cells(L, "A")                                 ' Recup nom de l'élève
        Sortie = Application.VLookup(Nom, Plage, 5, 0)      ' Recup date de sortie
        If Sortie <> 0 Then Rows(L).EntireRow.Hidden = True ' Si date de sortie on masque la ligne
    Next L
End Sub
Re,
Je fais fonctionner le fichier et essaie de comprendre le code
Une petite remarque: un élève peut être inscrit dans deux groupes différents, n'en quitter qu'un (fin de module par exemple) et rester inscrit dans l'autre; il a dans ce cas deux lignes dans la feuille 'données élèves'; avec votre solution, il semble qu'une date de sortie dans une de ces deux lignes le masque dans les deux groupes...
Mille mercis encore
bonsoir à tous
ici il suffit de mettre dans chaque feuille de groupe les deux lignes de code
bonjour et merci
Ca fonctionne, mais comme je l'ai écrit dans une de mes réponses précédentes, il est possible qu'un élève soit inscrit dans deux groupes , il a dans ce cas deux lignes dans la feuille 'données élèves'; j'ai testé avec votre solution et...s'il quitte un seul groupe, il est masqué dans les deux groupes alors qu'une seule date de sortie n'est entrée pour un seul groupe... je voudrais qu'il reste visible dans le groupe dans lequel il est encore inscrit... Je ne sais pas si c'est possible! Mais encore une fois merci pour votre travail!!
 
Re,
je vous reposte mon fichier de départ, que j'ai légèrement modifié pour qu'il ait une structure identique à mon fichier d'origine; j'ai ajouté les n° d'écrou qui nous permettent, quand on les saisit dans la feuille 'données_élèves', d'aller chercher les noms et prénoms dans la feuille 'base'
j'ai également ajouté les fonctions 'filtre' dans les feuilles groupes; les noms des groupes sont en D3 dans toutes les feuilles groupe, comme dans mon fichier d'origine
Merci encore et bon week end à tous
 

Pièces jointes

Bonsoir philkowa, le fil,

Le code dans ThisWorkbook s'exécute à l'ouverture du fichier :
VB:
Private Sub Workbook_Open()
MAJ 'lance la macro
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
Le code dans la feuille "données élèves" s'exécute chaque fois que le contenu d'une cellule est modifié :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
MAJ 'lance la macro
End Sub
Le code dans Module1 :
VB:
Sub MAJ()
Dim d As Object, F As Worksheet, tablo, i&, w As Worksheet
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse estignorée
Set F = Sheets("données élèves")
tablo = F.[A1].CurrentRegion.Resize(, 7)
For i = 2 To UBound(tablo)
    If IsDate(tablo(i, 7)) Then d(tablo(i, 2) & Chr(1) & tablo(i, 3) & Chr(1) & tablo(i, 5)) = ""
Next i
For Each w In Worksheets
    w.Rows.Hidden = False 'affiche tout
    If w.Name <> F.Name Then
        For i = 6 To w.Cells.SpecialCells(xlCellTypeLastCell).Row
            If d.exists(w.Cells(i, 1) & Chr(1) & w.Cells(i, 2) & Chr(1) & w.Cells(3, 4)) Then w.Rows(i).Hidden = True 'masque la ligne
        Next i
    End If
Next w
End Sub
Nota 1 : j'ai supprimé les formules avec FILTRE car je n'ai pas cette fonction.

Nota 2 : la colonne "écrou" ne sert à rien puisqu'elle n'existe pas dans les feuilles des groupes.

A+
 

Pièces jointes

Bonsoir tout le monde,
Un nouvel essai en PJ avec cette unique macro à mettre dans ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim DL%, L%, i%, Nom$, Prenom$, Groupe$, Tablo
    Application.ScreenUpdating = False
    With Sheets("données élèves")
        DL = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row       ' Dernière ligne du tableau des élèves
        Tablo = .Range("A2:G" & DL)                             ' Recup tableau élèves dans un array
    End With
    If Left([A1], 5) <> "Année" Then Exit Sub                   ' On sort si en A1 on n'a pas "Année"
    Groupe = [D3]                                               ' Recup du groupe de la feuille
    Cells.EntireRow.Hidden = False                              ' On démasque toutes les lignes
    DL = Cells(Cells.Rows.Count, "A").End(xlUp).Row             ' Dernière ligne utilisée
    For L = 6 To DL                                             ' Pour toutes les lignes
        Nom = Cells(L, "A"): Prenom = Cells(L, "B")             ' On récupère Nom et Prenom
        For i = 1 To UBound(Tablo)                              ' On balaie toute la liste des élèves
            If Tablo(i, 5) = Groupe Then                        ' Si c'est le bon groupe
                If Tablo(i, 7) <> "" Then                       ' et qu'il y a une date de sortie
                    If Tablo(i, 2) = Nom And Tablo(i, 3) = Prenom Then  ' et si c'est le bon élève
                        Rows(L).EntireRow.Hidden = True         ' Alors on ùmasque la ligne
                    End If
                End If
            End If
        Next i
    Next L
End Sub
Idem Job, "j'ai supprimé les formules avec FILTRE car je n'ai pas cette fonction."
Par sécurité je regarde si dans la feuille sélectionnée, A1 commence par "Année"
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour