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 :

masquer lignes selon conditions [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut masquer lignes selon conditions
    Bonjour,

    je cherche à masquer pour exploitation dans un fichier les ligne pour lesquelle la valeur dans la colonne v est égal zéro puis par la suite
    pour un plage donné si toute la plage est vide independemment de la colonne maquer toute la ligne
    exemple de ligne 1 à 92 masquer les ligne pour lesquelle en colonne v on a zéro
    puis regardeer dans la plage D98:T107 masquer toutes les lignes vides ,idem plages D122:T130,D184:T192;D198:T207;D228:T237;D245:T245;D249:T260;D266
    j'ai un code qui permet de masquer les lignes à zéro dans la colonne v mais c'est dans les plages que c'est un peu difficile : en fait dans les plages pour qu'une ligne soit supprimée il faut que toute la ligne dans la plage soit vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub masquer_lignes()
    Dim i As Long
    Sheets("Non-current Assets form").Select
    For i = 1 To 92
     If Cells(i, 22).Value = 0 And Cells(i, 1).Value <> "" Then
     Rows(i).Hidden = True
    End If
    Next
    Next

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Tu parles de masquage et de suppression...
    Dans ton code, tu masques les lignes si V=0 et A<>"".

    Qu'en est-il des plages ?
    Est-ce que tu dois aussi vérifier la valeur en A ou il faut vraiment que toute la ligne soit vide ?
    MPi²

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    En fait il faut juste masquer et non supprimer
    dans la plage si une ligne est vide la ligne entière doit être masquée.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 772
    Points : 28 633
    Points
    28 633
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En fait il faut juste masquer et non supprimer
    dans la plage si une ligne est vide la ligne entière doit être masquée.
    La méthode AdvancedFilter de l'objet Range peut répondre à ta demande avec comme critère nommé la formule NBVAL
    Exemple pour une zone data (plage $A$1:$F$203 de la feuille nommée [db]) et la zone des critères en I1:I2 avec comme étiquette de colonne en (I1) par exemple _fn_ et la formule en I2
    La procédure VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MasquerLigne()
     Dim rngData As Range, rngCriteria As Range
     With ThisWorkbook.Worksheets("db")
      Set rngData = .Range("A1:F203")
      Set rngCriteria = .Range("I1:I2")
     End With
     rngData.AdvancedFilter xlFilterInPlace, rngCriteria
    End Sub
    A lire Les filtres avancés ou élaborés dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    j'ai testé le code mais cela ne semble pas convenir. normalement je ne dois pas mettre saisir dans la feuille.

    ce que je voudrais c'est un code simple qui dirait si une ligne de la plage est vide alors masquer la ligne entière.

    j'ai ecris ce code mais il bug sur la ligne 7 normalement si c'est corrigé ça devrait marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub masquer1()
     
     Dim i As Integer
     
      Sheets("DD").Select
     For i = 98 To 107
      If Range("D" & i & ":T" & i).Cells Is Empty Then
     Rows(i).Hidden = True
     End If
     
     Next
     
    End Sub

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Je ne sais pas si les lignes que tu mentionnes sont toujours les mêmes ou non.
    Si oui, ceci devrait fonctionner.
    Il reste aussi le critère de la cellule A (Cells(I, 1).Value = 0 ) que je n'ai pas considéré... à rajouter à la condition si nécessaire

    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
    Sub masquer_lignes()
        Dim I As Long, J As Long
        Dim Plages
     
        'Tableau des débuts et fins des plages
        Plages = Array(122, 130, 184, 192, 198, 207, 228, 237, 245, 249, 260, 266)
     
        Sheets("Non-current Assets form").Select
        For I = 1 To 92
            If Cells(I, 22).Value = 0 And Cells(I, 1).Value <> "" Then
                Rows(I).Hidden = True
            End If
        Next
     
        For J = LBound(Plages) To UBound(Plages) Step 2
            For I = Plages(J) To Plages(J + 1)
                If Application.CountA(Rows(I)) = 0 Then     'Si la ligne est vide
                    Rows(I).Hidden = True                          'on masque
                End If
            Next
        Next
    End Sub
    MPi²

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Bonjour Parmi merci pour ton intervention,

    En fait dans le code que tu as proposé les instructionS jusqu'à la ligne 14 s'executent
    par contre les instructions à partir de la ligne 15 s'executent pas.
    par ailleurs, les critères ont évolué.
    En fait, il s'agit de balayer les valeurs des cellules de A98 à A266, si valeur en question est déjà présente entre A5 et A92 que sur la même ligne de V5 V92 la valeur est égale à zéro alors masquer la ligne.
    j'ai testé le code ci dessous mais il m'affiche à chaque fois l'indice n'appartient pas à la selection
    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
    30
    31
    32
    33
    34
    35
    36
    37
    Sub masquer1()
     
     
     Dim x As Variant
     Dim I As Integer
     Dim J As Integer
     
    ReDim x(nb_codes)
    nb_codes = Sheets("Non-current Assets form").Cells(5, 1).Cells(92, 1)
     
    For I = 1 To nb_codes
    11   x(I) = Sheets("Non-current Assets form").Cells(I, 1)
    Next I
     
    For I = 1 To UBound(x)
       x(I) = Sheets("Non-current Assets form").Cells(I, 1)
    Next I
     
    Sheets("Non-current Assets form").Select
     
     For J = 98 To 107
     If Cells(J, 1).Value = x(I) And Cells(I, 22).Value = 0 Then
     Rows(J).Hidden = True
     End If
     Next
     
     For J = 109 To 120
     If Cells(I, 1).Value = x(I) And Cells(I, 22).Value = 0 Then
     Rows(J).Hidden = True
     End If
     Next
     
     For J = 122 To 130
     If Cells(J, 1).Value = x(I) And Cells(I, 22).Value = 0 Then
     Rows(J).Hidden = True
     End If
     Next

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Dans tes dernières boucles, la variable I n'a pas sa raison d'être.
    Elle équivaut à UBound(x) + 1 puisque le dernier appel à I est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For I = 1 To UBound(x)
       x(I) = Sheets("Non-current Assets form").Cells(I, 1)
    Next I
    MPi²

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    ok j'ai remplacé la variable I par UBound(x) + 1 mais ça ne marche toujours pas
    il affiche toujours l'indice n'appartient pas à la selection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sheets("Non-current Assets form").Select
     
     For J = 98 To 107
     If Cells(J, 1).Value = x(UBound(x) + 1) And Cells(UBound(x) + 1, 22).Value = 0 Then
     Rows(J).Hidden = True
     End If
     Next

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    je n'ai relu que le dernier message ...

    par défaut les tableaux sont numéroté de à partir de l'index 0 ...

    et donc Ubound(X)renvoi le dernier indice utilisable de ton tableau ... tu ne peu pas accéder à X(Ubound(X)+1) ...

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Pas très clair comme problème...
    Est-ce que les valeurs entre les lignes 5 et 92 peuvent se répéter ?
    Aucune ligne dans cette partie ne sera masquée ?
    MPi²

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    oui effectivement les valeurs de 5 à 92 peuvent se répéter, et celles pour lesquelles la colonne v est à zéro seront sur des lignes masquées.
    si une des valeurs des lignes 5 à 92 se répète sur les lignes 98 à 266 et que la colonne v correspondante entre les ligne 5 à 92 est à 0 alors cette ligne doit être aussi masquée


    Par exemple
    de la ligne 5 à la ligne 92
    sur la ligne 15 en A15 j'ai la valeur "A21100" si V15 =0 la ligne 15 doit être masquée

    maintenant de la ligne 98 à la ligne 266 chaque fois que la valeur "A21100" apparaît sur une ligne celle ci devra être masquée

    le code pour masquer les lignes de 5 à 92 je l'ai déjà c'est par contre celui pour masquer les lignes de 98 à 266 qui pose problème

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bon, de ce que je peux comprendre, ceci devrait fonctionner
    Donc, tu roules la 1e macro MasquerHaut qui va appeler MasquerBas si une ligne du haut est masquée

    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
    Sub MasquerHaut()
        Dim I As Long
     
        For I = 5 To 92
            If Range("A" & I) <> "" And Range("V" & I) = 0 Then
                'masquer la ligne
                Rows(I).Hidden = True
                'Masquer la partie du bas
                MasquerBas Range("A" & I)
            End If
        Next
    End Sub
     
    Sub MasquerBas(Valeur)
        Dim I As Long
     
        For I = 98 To 266
            If Range("A" & I) = Valeur Then
                'masquer la ligne
                Rows(I).Hidden = True
            End If
        Next
    End Sub
    MPi²

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    c'est bon merci parmi,

    j'ai fait plusieurs test et c'est parfait ça marche comme souhaité.
    Merci encore.

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

Discussions similaires

  1. Couper coller une ligne selon condition
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/05/2019, 08h50
  2. masquer colonnes selon conditions
    Par chouchouboy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/10/2010, 19h39
  3. supprimer ligne selon condition
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/06/2009, 16h39
  4. Colorer une ligne selon condition
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2008, 08h23
  5. copier des lignes selon condition
    Par malek1913 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2008, 16h45

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