IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Cacher des lignes automatiquement selon condition


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut Cacher des lignes automatiquement selon condition
    Bonjour à tous,

    J'ai un tableau reprenant des projets avec une date de début et une date de fin, et sur une autre feuille un graphique sur deux semaines reprenant les info de ce tableau.

    J'aimerai que si un projet n’apparaît pas dans les deux semaines choisies la ligne en question soit masquée.

    Merci !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Pas besoin de VBA pour ça. Place un filtre sur tes données.
    Tu sélectionnes tes données > Ruban Données > Icone Filtrer

    Des boutons avec un flèche vers le bas apparaissent dans les entêtes.
    Tu cliques sur celui concernant tes dates et tu fixes tes bornes.
    Les lignes qui seront hors critères seront masquées et n'apparaitront plus dans tes graphiques.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Bonjour Menhir,

    Merci pour ta réponse, mais j'aimerais vraiment que ce soit automatisé. Le principe étant que les utilisateurs remplissent uniquement le tableau et ne touchent pas à l'onglet avec le graphique.

    En gros j'aimerai que chaque ligne soit testée et si le projet n'est pas dans la fourchette des deux semaines affichées ça masque la ligne.

    Ça ne risque pas de devenir trop lourd quand il y aura trop de projets ? Un autre moyen que ligne par ligne ?

  4. #4
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Voici ce que j'ai fais jusqu'ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Worksheet_Calculate()
        Dim plage As Range, c As Range, i As Integer
        i = 5
        Set plage = Range("A10:A15")
        For Each c In plage
            If (Range("B5").Value <= Sheets("Tableau").Range("C" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("C" & i).Value) Or (Range("B5").Value <= Sheets("Tableau").Range("D" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("D" & i).Value) Then
                'MsgBox Range("B5").Value & " " & Sheets("Tableau").Range("C" & i).Value
                c.EntireRow.Hidden = False
            Else
                c.EntireRow.Hidden = True
            End If
            i = i + 1
        Next c
        Set plage = Nothing
    End Sub
    J'ai un message d'erreur sur c.EntireRow.Hidden = True

    Pour le reste ça à l'air de faire exactement ce que je demande la petite message box est là pour ça. Pour l'instant je fais ça sur 6 ligne (A10 -> A15) mais normalement ce code s'effectuera sur 200 lignes.. d'où ma question précédente sur la lourdeur du truc...

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Almenor Voir le message
    j'aimerais vraiment que ce soit automatisé.
    Il suffit de faire la même chose que ce que j'explique ci-dessus avec une instruction VBA.
    L'enregistreur automatique de macro pourra te fournir 80% du code.
    L'aide VBA en ligne t'aidera à trouver les 20% restant.

    Citation Envoyé par Almenor Voir le message
    Ça ne risque pas de devenir trop lourd quand il y aura trop de projets ?
    Avec ta méthode, vraisemblablement (les boucles For sont affreusement lentes pour des macro évènementielles).
    Avec ma méthode, ce sera sans doute plus rapide.

    Private Sub Worksheet_Calculate()
    Il serait plus sûr d'utiliser Worksheet_Change, en commençant par vérifier si la zone modifiée est bien celle où tu entres les dates "bornes" pour éviter d'exécuter le reste si ce n'est pas le cas.
    https://msdn.microsoft.com/fr-fr/lib.../ff839775.aspx
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Le soucis avec Worksheet_Change est que comme on navigue dans le calendrier via une barre de défilement il ne repère pas les changement sur la cellule liée.

    J'ai lié la barre de défilement à la cellule B1, le contenu change donc quand on fait défiler la barre de défilement mais Worksheet_Change ne détecte pas ce changement alors que si je change la valeur de la cellule B1 manuellement là pas de soucis.

    C'est pour cela que je passe par calculate mais effectivement ça s'active au moindre changement :s

  7. #7
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    J'ai un peu améliorer le code pour éviter toute actions inutile.

    Désormais il fera les différents tests uniquement sur le mouvement de la barre de défilement. En gros quand je lance excel il stock la position actuelle de la barre de défilement et il ne rentrera dans le code uniquement sur une valeur différente.

    Toujours dans un soucis d'économiser les ressources il ne testera pas sur les 200 lignes comme j'avais prévu au départ mais jusqu'à la dernière ligne non vide.

    Voici la dernière version de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Private Sub Worksheet_Calculate()
        If ThisWorkbook.scrollnumber <> Range("B1").Value Then
            MsgBox "on rentre dans le calculate !"
            Dim plage As Range, c As Range, i As Integer
            i = 5
            Set plage = Range("A10:A200")
            For Each c In plage
                If c <> "" Then
                    If (Range("B5").Value <= Sheets("Tableau").Range("C" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("C" & i).Value) Or (Range("B5").Value <= Sheets("Tableau").Range("D" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("D" & i).Value) Then
                        MsgBox c & " a un projet"
                        'c.EntireRow.Hidden = False
                    Else
                        MsgBox c & " n'a pas de projet !"
                        'c.EntireRow.Hidden = True
                    End If
                End If
                i = i + 1
            Next c
            Set plage = Nothing
            ThisWorkbook.scrollnumber = Range("B1").Value
        End If
    End Sub
    Il ne me reste plus qu'à savoir comment cacher la ligne puisque c.EntireRow.Hidden = True n'a pas l'air de fonctionner :s

  8. #8
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    J'ai finalement quelque chose qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Private Sub Worksheet_Calculate()
        If ThisWorkbook.scrollnumber <> Range("B1").Value Then
            'MsgBox "on rentre dans le calculate !"
            ThisWorkbook.scrollnumber = Range("B1").Value
            Dim plage As Range, c As Range, i As Integer, row As Integer
            i = 5
            row = 10
            Set plage = Range("A10:A200")
            For Each c In plage
                If c <> "" Then
                    If (Range("B5").Value <= Sheets("Tableau").Range("C" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("C" & i).Value) Or (Range("B5").Value <= Sheets("Tableau").Range("D" & i).Value And Range("AC5").Value >= Sheets("Tableau").Range("D" & i).Value) Then
                        'MsgBox c & " a un projet"
                        Rows(row & ":" & row).Select
                        Selection.EntireRow.Hidden = False
                        Range("A" & row).Select
                    Else
                        'MsgBox c & " n'a pas de projet !"
                        Rows(row & ":" & row).Select
                        Selection.EntireRow.Hidden = True
                        Range("A" & row).Select
                    End If
                End If
                i = i + 1
                row = row + 1
            Next c
            Set plage = Nothing
        End If
    End Sub
    Pas sûr que ce soit très optimal, à voir comment cela ce comportera quand il y aura plusieurs 10aine de projets...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer des lignes Excel selon plusieurs conditions avec VBA
    Par StVenum dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/01/2017, 13h04
  2. [XL-2007] Cacher des lignes sous conditions
    Par celine31190 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 13/11/2015, 14h48
  3. inserer des lignes automatiquement
    Par ANTMA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/12/2007, 12h42
  4. Cacher des lignes d'un CheckListBox + Champ tag
    Par Anified dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/09/2007, 15h01
  5. Cacher des lignes d'un tableau
    Par frechy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 18/07/2005, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo