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

Excel Discussion :

Taille du résultat d'une sélection avec filtres


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Taille du résultat d'une sélection avec filtres
    Bonjour,

    Sur mon fichier excel, je crée une macro afin d'effectuer une sélection grâce à plusieurs filtres. Ca j'ai réussi à faire. Seulement j'aimerais connaître la taille de cette sélection. C'est ça que je n'arrive pas à faire et j'aurais besoin d'un peu d'aide sur ce point.

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bonjour,

    Qu'est-ce que tu entends par taille ?
    Le nombre de lignes visibles ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim nbLignes As Long
        nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
        MsgBox Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Oui c'est ça merci beaucoup
    Maintenant, j'ai un autre problème :
    Je suis dans une boucle for qui agit sur 2 filtres. Voici la trame : (cible et typo sont les filtres sur lesquels j'agis)


    For cible de 0 à 50
    For typologie de 0 à 3
    If Nombre de lignes de la selection > 1 Then 'Donc If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count > 1 Then
    Copie des données
    Coller dans nouvelle feuille
    En faire un graphique
    Next typo
    Else
    Next typo
    End if
    Next cible


    Ca ne marche pas : ça me renvoie :
    Erreur de compilation : Next sans For

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Partant du principe que tu donnes, Next typo va se faire automatiquement donc pas nécessaire de le mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For cible de 0 à 50
       For typologie de 0 à 3
          If Nombre de lignes de la selection > 1 Then 'Donc If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count > 1 Then
             Copie des données
             Coller dans nouvelle feuille
             En faire un graphique
          End if
       Next typologie
    Next cible
    L'erreur provient du fait que le Next est à l'intérieur du If...End If

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    D'accord merci beaucoup.
    Quand je lance la macro, ça marche une première fois, puis ça me met une erreur :
    Erreur d'exécution '6' : Dépassement de capacité

    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
    For c = 0 To 50
            For t = 0 To 3
                ActiveSheet.Range(Range("A1:AI1"), Range("A1:AI1").End(xlDown)).AutoFilter Field:=34, Criteria1:= _
            cible(c)
                ActiveSheet.Range(Range("A1:AI1"), Range("A1:AI1").End(xlDown)).AutoFilter Field:=29, Criteria1:= _
            typo(t)
     
                Dim nbLignes As Long
                nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
     
                If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count > 1 Then
                    Range(Range("B1:G1"), Range("B1:G1").End(xlDown)).Select
                    Selection.Copy
                    Sheets.Add After:=ActiveSheet
                    Range("C4").Select
                    ActiveSheet.Paste
     
                    Sheets("BASE").Select
                Else
                    Sheets("BASE").Select 'J'ai mis ça pour que ça ne soit pas vide
                End If
            Next t
        Next c

  6. #6
    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 Marims Voir le message
    ça me met une erreur :
    Erreur d'exécution '6' : Dépassement de capacité
    Quelle ligne de code se met en surbrillance quand l'erreur se produit ?

    Ne met pas un Dim dans une boucle For... to (ni dans une autre boucle).
    Un Dim est une déclaration. Ca se met en début de code.

    Quand on copie des cellules, on ne les colle pas comme des onglets (voir ton Copy et ton Paste).
    Je suppose qu'à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("C4").Select
    ActiveSheet.Paste
    Tu voulais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("C4").Select
    Selection.PasteSpecial(xlPasteAll)
    Evite d'utiliser des Select / Selection. Ca ralentit l'exécution et ça complexifie le code.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range(Range("B1:G1"), Range("B1:G1").End(xlDown)).Select
    Selection.Copy
    Range("C4").Select
    Selection.PasteSpecial(xlPasteAll)
    peut se simplifier en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(Range("B1:G1"), Range("B1:G1").End(xlDown)).Copy
    Range("C4").PasteSpecial(xlPasteAll)
    Voir même en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Range("B1:G1"), Range("B1:G1").End(xlDown)).Copy(Range("C4"))
    Ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Sheets("BASE").Select
    Else
        Sheets("BASE").Select 'J'ai mis ça pour que ça ne soit pas vide
    End If
    Peut s'écrire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    End If
    Sheets("BASE").Select
    Le Else n'est pas obligatoire dans un test If

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci beaucoup pour ces conseils !!

    La ligne qui se met en surbrillance est la suivante :
    If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count > 1 Then

  8. #8
    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 Marims Voir le message
    La ligne qui se met en surbrillance est la suivante :
    If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count > 1 Then
    Place un point d'arrêt juste avant et regarde le contenu de ta variable nbLignes.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Le point d'arrêt, c'est le point couleur bordeau ?

    Dans la variable nbLignes, j'ai le numéro de ligne maximal d'une sélection.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Place-toi sur la ligne précédente et tape F9 ou clique dans la bordure gauche pour faire apparaître un point rouge.
    Quelle est la valeur de nbLignes ?

  11. #11
    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
    Comme le dis Parmi et comme je le suggérais, ce qui est important, ce n'est pas ce que tu souhaites mettre dans cette variable mais la valeur qui s'y trouve réellement.
    Pour ça, il faut faire soit un point d'arrêt et regarder sa valeur dans les variables locales (quoi que... je pense qu'on peut regarder les variables locales si on choisit Débuger comme bouton suite à un message d'erreur), soit mettre juste avant la ligne qui génère l'erreur un
    pour que la valeur de cette variable s'affiche dans la fenêtre d'exécution.

    Parce que sinon, je ne vois pas trop ce qui pourrait entrainer un dépassement de capacité sur cette ligne.

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Quand je fais un MsgBox(nbLignes), il me dit 2658 pour la première itération

  13. #13
    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
    C'est ta première itération qui génère le message d'erreur ?
    Si la réponse est non, alors fait tourner jusqu'à obtenir le message d'erreur et regarde ce que donne le contenu de cette variable.

    Mais je te conseille fortement d'utiliser Debug.Print plutôt que MsgBox qui oblige à valider à chaque fois et à relever le nombre à la main alors que Debug.Print va simplement te faire une liste dont tu pourras consulter facilement le dernier élément quand ça va planter.

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Le message d'erreur intervient à la 7ème itération, lorsque la sélection est vide (donc count pas > 1)
    J'ai essayé debug.print mais rien ne s'affiche

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Pour voir le résultat de Debug.Print, tu dois afficher la fenêtre Exécution (menu Affichage ou tape Ctrl-G)

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Ca me donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    2777 
     3114 
     3490 
     4007 
     2530 
     1
    (j'me suis trompée tout à l'heure, c'est à la 6ème itération que ça plante)

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Peux-tu remettre le code où tu en es rendue ?

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Le voici :

    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
        Dim nbLignes As Long
        Dim taille As Integer
     
        For c = 0 To 50
            For t = 0 To 3
                ActiveSheet.Range(Range("A1:AI1"), Range("A1:AI1").End(xlDown)).AutoFilter Field:=34, Criteria1:= _
            cible(c)
                ActiveSheet.Range(Range("A1:AI1"), Range("A1:AI1").End(xlDown)).AutoFilter Field:=29, Criteria1:= _
            typo(t)
     
                nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
     
                Debug.Print nbLignes
                If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count >= 2 Then
                    Range(Range("B1:G1"), Range("B1:G1").End(xlDown)).Select
                    Selection.Copy
                    Sheets.Add After:=ActiveSheet
                    Range("C4").Select
                    Selection.PasteSpecial (xlPasteAll)
                    Range("A1").Select
                    ActiveCell.FormulaR1C1 = cible(c)
                    Range("A2").Select
                    ActiveCell.FormulaR1C1 = typo(t)
     
                    Sheets("BASE").Select
                End If
            Next t
        Next c
     
    End Sub

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    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 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Je n'ai pas testé, mais j'ai simplifié un peu
    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
    Sub x()
        Dim nbLignes As Long
        Dim taille As Integer
     
        nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
     
        For c = 0 To 50
            For t = 0 To 3
                ActiveSheet.Rows(1).AutoFilter Field:=34, Criteria1:=cible(c)
                ActiveSheet.Rows(1).AutoFilter Field:=29, Criteria1:=typo(t)
     
                Debug.Print nbLignes
                If Range("A1:A" & nbLignes).SpecialCells(xlCellTypeVisible).Count >= 2 Then
                    Range("B1:G" & nbLignes).SpecialCells(xlCellTypeVisible).Copy
                    Sheets.Add After:=ActiveSheet
                    Range("C4").PasteSpecial (xlPasteAll)
                    Range("A1") = cible(c)
                    Range("A2") = typo(t)
     
                    Sheets("BASE").Select
                End If
            Next t
        Next c
     
    End Sub
    Est-ce que ça te donne toujours une erreur ?
    Si oui, quel est le message ?

  20. #20
    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 Marims Voir le message
    Le message d'erreur intervient à la 7ème itération, lorsque la sélection est vide (donc count pas > 1)
    Dans ce cas, au minimum, il faut mettre un test pour vérifier si la sélection est vide et, dans ce cas, sortir de la boucle.
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If nbLignes<=0 Then Exit For
    A mettre juste après le "nbLignes = ..."

    Mais la simplification donnée par Parmi apporte bien plus.
    En particulier, il supprime les Select / Selection qui, dans ton cas (et dans la majorité des cas), sont inutile et ne servent qu'à compliquer le code et ralentir l'exécution.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/05/2011, 01h07
  2. Impossible d'exporter le résultat d'une requete avec Runtime
    Par papatte62360 dans le forum Runtime
    Réponses: 4
    Dernier message: 24/11/2006, 12h48
  3. Afficher le résultat d'une requête avec des côtes
    Par sweet_hell dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/10/2006, 10h32
  4. Réponses: 5
    Dernier message: 04/07/2006, 11h19
  5. Pb résultats d'une requête avec ou sans Recordset
    Par fredeau dans le forum Access
    Réponses: 3
    Dernier message: 24/04/2006, 14h07

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