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 des lignes sur condition


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut Masquer des lignes sur condition
    Bonjour,
    J'utilise actuellement ce code pour masquer des lignes (merci à ceux qui m'ont aidé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Masquer()
    Dim i As Long
        For i = 11 To Rows.Count
            If Range("A" & i).Text = "" Then Exit For
                If Range("C" & i).Value = "Archivé" Then
                Rows(i).Hidden = True
            End If
        Next i
    End Sub
    Comme j'ai beaucoup de lignes, je le trouve assez lent et j'ai l'impression qu'après avoir testé une ligne, il retourne à l'origine avant de redescendre lire la ligne suivante.
    Après avoir testé une ligne, n'est-il pas possible de :
    - lire immédiatement la ligne suivante,
    - si la cellule A est vide, alors sortir sinon
    - si la cellule C est égale à "Archivé", masquer toute la ligne sinon passer à la suivante.
    Cela est-il possible? et si oui, comment modifier le code?
    A l'avance, merci.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Hello
    Je ne comprends pas précisemment ce que tu veux?
    Qu'entends tu par "tester une ligne" ? Vérifier que sa cellule A est vide?
    Si elle est vide, tu veux sortir complètement de la boucle ou juste passer à la ligne suivante?

  3. #3
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Oui c'est long parce que tu vérifies les 65535 lignes...(voir bcp plus si tu es en 2007)

    Autre petit détail, pour supprimer ou masquer des lignes, il faut faire une boucle en remontant sinon ça coince lorsque plusieurs lignes consécutives sont à masquer

    Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Masquer()
    Dim i As Integer
        For i = Cells(Rows.Count, 1).End(xlUp).Row To 11 Step -1
            If Cells(i, 3) = "Archivé" Then Rows(i).Hidden = True
        Next i
    End Sub
    Et dans ce cas plus besoin de vérifier si A est vide

  4. #4
    Membre averti Avatar de tomy7
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 540
    Points : 391
    Points
    391
    Par défaut
    je pense que le seul truc qui fait que tu rame est le row.count


    alors fixe plutot une valeur : For i = 1 to 1000

    sinon test avec ce que fais fring
    mais moi j ai un code comme le tien qui fonctionne tres bien...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Par tester je voulais parler des conditions,
    Si la cellule A est vide, c'est que nous sommes à la fin des enregistrements et donc sortir.
    Si la cellule A n'est pas vide et que la cellule C est égale à "Archivé" alors masquer la ligne entièrement puis passer à la ligne suivante.
    Si la cellule A n'est pas vide et que la cellule C est différente de "Archivé" alors ne rien faire et passer à la ligne suivante.
    J'espère avoir été plus clair.

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    euuhhhh...je suppose que vu ta réponse...tu as testé le code que je te propose ou du moins que tu l'as lu ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Pour Fring,
    Ce n'est pas le nombre de lignes qui fait qu'il rame, car quand je lance le masquage, je peux suivre la progression qui est très lente, d'où ma question d'origine.

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bon... fais comme tu veux
    Pour info, je viens de tester sur 5000 lignes, ça prend 5 secondes, même résultat chez toi ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Pour 624 lignes, il a mis 105 secondes. J'ai cru qu'il était planté. C'est peut-être dû au volume de chaque ligne?

  10. #10
    Membre averti Avatar de tomy7
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 540
    Points : 391
    Points
    391
    Par défaut
    pk tu mets pas exit sub au lieu de exit for?
    as tu changé ton row.count par une valeur pour tester?
    as tu essayé le code de fring?

  11. #11
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Non le volume de chaque ligne n'intervient pas.
    Je ne sais pas pourquoi ça prend autant de temps pour si peu de lignes mais tu ne m'as pas répondu à la question : as-tu essayé le bout de code que je te propose ? si oui, même résultat ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Pour Tomy7
    Pour le exit sub, je ne sais pas, c'est du code récupéré.
    J'ai testé le code de Fring et j'ai 105 secondes pour 624 lignes et idem en mettant des bornes en dur de 12 à 1000.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Pour Fring,
    Les 105 secondes, c'est avec le code que tu as mis dans le post 3.
    J'ai beaucoup de colonnes techniques masquées, cela peut-il influer?

  14. #14
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    aaah ok, fallait le dire tout de suite alors...le problème vient d'ailleurs. Difficile de répondre à distance, peux-tu mettre une copie de ton fichier en pièce jointe ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Pour Fring,
    Je suis désolé, mais c'est toute la gestion d'une entreprise, je ne peux pas l'expédier. Si ce n'est pas possible, nous continuerons de masquer manuellement.
    Dans une précédente discussion, tu m'avais suggéré de filtrer pour ne laisser que les autres lignes et l'affichage était correct, mais quand je voulais faire un copier/coller de plusieurs lignes, Excel me retournait un message d'erreur, ce qui n'est pas le cas avec le masquage.

  16. #16
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Oui je me souviens de ce fil, pourtant il n'y a aucun problème à copier des lignes d'un tableau filtré, du moins manuellement. Le faisais-tu via une macro ce copier/coller ?

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Oui, c'est via une macro, c'est peut-être la raison. Veux-tu voir le code de cette macro?
    Je viens de tester en démasquant les colonnes, et j'obtiens 60 secondes au lieu des 105

  18. #18
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Tu peux essayer le code ci-dessous pour copier les lignes restantes après que le tableau soit filtré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Copier/Coller()
    Dim i%
    For i = 11 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 1).EntireRow.Hidden = False Then
    Rows(i).Copy Sheets("Feuille_de_destination").Cells(Rows.Count, 1).End(xlUp)(2)
    End If
    Next
    End Sub
    Ceci dit cela n'explique toujours pas pourquoi autant de temps pour masquer les lignes...

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 681
    Points : 633
    Points
    633
    Par défaut
    Voici mon code de copier/coller.
    Mon copier se fait sur 6 lignes maximum qui sont ensuite collées à partir de la ligne 1. Ces 6 lignes maxi représentent 1 dossier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub ChargerDossier()
    ' Touche de raccourci du clavier: Ctrl+d
      ActiveSheet.Protect DrawingObjects:=False, Contents:=False, Scenarios:=False      ' Déprotéger la feuille
      Rows("1:6").ClearContents  ' Effacer les lignes 1 à 6
      Selection.Copy  'Copier les lignes sélectionnées
      Rows("1:1").Select  'Selectionner la ligne1
      ActiveSheet.Paste  ‘ Coller la sélection
      ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False  ' reprotéger la feuille
    End Sub

  20. #20
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Si je comprend bien, tout ce qui est ActiveSheet concerne la feuille de destination de la copie.
    Ce qui me chipote est la ligne
    Quelle Selection ? C'est une sélection manuelle ?

    Supposons que oui, à vue de nez le problème vient du fait que ton code se déroule sur une feuille active (ActiveSheet) et que tu lui demandes de copier ce qui a été sélectionné sur une autre feuille mais sans préciser le nom de cette feuille.

    Je travaillerais dans l'autre sens, depuis la feuille où les éléments sont copiés en laissant cette feuille "source" active.
    A la volée ça donnerait un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ChargerDossier()
      With Sheets("Toto")
      .Protect DrawingObjects:=False, Contents:=False, Scenarios:=False
      .Rows("1:6").ClearContents
      Selection.Copy .Range("A1")
      .Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
      End With
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Masquer des lignes avec une condition
    Par mjp06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/03/2019, 19h23
  2. Masquer des lignes sous condition
    Par linousxm dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2010, 13h19
  3. Datagridview: Masquer des cellules sur certaines lignes
    Par boby62423 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 27/04/2009, 14h57
  4. Masquer / démasquer des lignes sur critère.
    Par marc56 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 28/02/2008, 01h54

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