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 :

VBA : ne pas compter les cellules vides


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut VBA : ne pas compter les cellules vides
    Bonjour à toutes et à tous,

    Je voulais, sur les conseils du forum, utiliser sous.total pour compter dans un tableau filtré mais il y a une condition. Malgré la patience et les conseils de différentes personnes, je ne suis pas arrivé au résultat voulu.

    J'ai donc trouvé sur le net cette formule qui fonctionne bien excepté qu'elle prend en compte les cellules vides et je voudrais qu'elle ne compte pas les cellules vides.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function CompterPositifs(Plage As Range)
        Dim C As Range
        Application.Volatile
        For Each C In Plage
            If C.EntireRow.Hidden = False And C.Value > 0 Then
                CompterPositifs = CompterPositifs + 1
            End If
        Next C
    End Function
    Comment puis je faire pour que les cellules vides ne soient pas comptées ?

    Merci pour vos avis et aides.

    Bon week end

  2. #2
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    J'ai fais des essais et pour moi le résultat est conforme; les cellules vides ne sont pas comptabilisées.

    Après il peut y avoir un hic si la zone sélectionnée contient des fonctions SI qui demandent de ne rien faire sous la forme de
    Dans ce cas, il faut modifier ton code de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function CompterPositifs(Plage As Range)
        Dim C As Range
        Application.Volatile
        For Each C In Plage
            If C.EntireRow.Hidden = False And C.Value <> "" Then
                CompterPositifs = CompterPositifs + 1
            End If
        Next C
    End Function
    on ne vérifies pas que le contenu de la cellule et supérieur à 0 mais qu'il est vide.

    En espérant que j'ai pas tout faux.

    GG

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Bonjour Jerome,

    Je te remercie pour cette réponse dominicale.


    Effectivement la colonne a le calcul suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTVIDE(T16);"";+[@[Exit_value]]-[@[Entry_value]])
    Ton code fonctionne parfaitement.
    Il compte bien toutes les cellules qui ne sont pas vides. Très bien mais .....

    - Je voudrais qu'il me compte les cellules qui sont positives

    J'ai donc ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function CompterPositifs(Plage As Range)
        Dim C As Range
        Application.Volatile
        For Each C In Plage
            If C.EntireRow.Hidden = False And C.Value > 0 Then
                CompterPositifs = CompterPositifs + 1
            End If
        Next C
    End Function
    Et pour les cellules négatives, j'ai celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function CompterNegatifs(Plage As Range)
        Dim C As Range
        Application.Volatile
        For Each C In Plage
            If C.EntireRow.Hidden = False And C.Value < 0 Then
                CompterNegatifs = CompterNegatifs + 1
            End If
        Next C
    End Function
    Le problème est que dans la colonne, il peut y avoir des cellules vides qui sont calculées comme positives.

    Merci d'avance pour ton aide.

    Bon dimanche

  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
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le problème est que dans la colonne, il peut y avoir des cellules vides qui sont calculées comme positives.
    C'est très curieux ce que tu annonces car une cellule vide d'excel vaut 0 donc si l'on teste ce qui est supérieur à 0 (>0) on calculera bien les positifs
    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 éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Bonjour Philippe,

    J'ai également essayé en modifiant ma formule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTVIDE(T16);"OUVERT";+[@[Exit_value]]-[@[Entry_value]])
    J'ai donc un OUVERT à la place de la cellule vide et c'est quand même "comptabilisé" comme positif.
    La colonne est en format Nombre.

    Je ne comprends pas du tout.

    Merci

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction ESTVIDE, renvoie FAUX si la cellule que tu testes contient une fonction qui renvoie une chaîne vide.
    Utilise plutôt NB.VIDE qui dénombre le nombre de cellules vides en ce compris celles qui contiennent une fonction qui renvoie une chaîne vide
    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

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Merci Philippe pour ta réponse,

    Je n'ai pas de FAUX, juste des cellules vides (C'est ce que je veux si un élément du calcul manque)

    NB.VIDE : oui je l'utilise mais dès que je filtre (en fait j'utilise des segments) ça fausse les calculs puisque je veux que ce soit les calculs des données filtrées qui apparaissent.

    J'ai essayé sous.total également mais comme il y a une condition, ça ne fonctionne pas.
    J'ai essayé beaucoup de choses qui m'ont été conseillée sur ce forum mais sans succès.

    Je passe donc au VBA mais là également un souci

    Merci


    PS : Je viens de tester quand la cellule est à 0 (et non vide donc) elle n'est pas comptée comme positive mais dès qu'elle est vide, elle est comptée comme positive
    PS 2 : En modifiant ma formulaire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTVIDE(T16);"0";+[@[Exit_value]]-[@[Entry_value]])
    Le calcul est bon. J'ai un 0 qui s'affiche dans ma colonne mais pas trop grave.

    Encore merci pour votre aide

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ma réponse fait écho à la formule que tu as publiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTVIDE(T16);"OUVERT";+[@[Exit_value]]-[@[Entry_value]])
    et donc si T16 contient par exemple ="" la fonction ESTVIDE renverra FAUX alors que pour toi elle semble vide
    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

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Ma réponse fait écho à la formule que tu as publiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTVIDE(T16);"OUVERT";+[@[Exit_value]]-[@[Entry_value]])
    et donc si T16 contient par exemple ="" la fonction ESTVIDE renverra FAUX alors que pour toi elle semble vide
    OK je te remercie pour cette explication.
    Il ne faut pas toujours se fier à ce que l'on voit donc

    En tous cas, avec l'affichage du 0, les calculs fonctionnent

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En tous cas, avec l'affichage du 0, les calculs fonctionnent
    Alors tout va bien, tu peux donc mettre cette discussion comme résolue.

    Cependant, pour ma part, je trouve inutile de passer par du VBA pour résoudre un problème qui doit certainement être résolu en utilisant des fonctions natives d'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

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Je suis d'accord avec toi mais je n'ai pas trouvé de solution avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SOUS.TOTAL(3;t_trades[PnL])
    puisque je voudrais que le sous.total soit calcul uniquement sur les valeurs positives.


  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    SI tu utilises les segments, cela signifie que tu utilises les tableaux structurés donc à ta place, j'insérerais une colonne avec une formule qui renvoie le texte "Positif" si une cellule contient une valeur positive et rien ou autre chose pour les valeurs négatives, nulles ou vides.
    Ainsi en sélectionnant les "positifs" dans le segment tu aurais inévitablement la synthèse des lignes visibles et ce dans toutes les colonnes où tu auras placé des fonctions de synthèse (Somme, Nombre, Moyenne, etc.)

    Variante : la formule pourrait renvoyer Positif, Négatif ou Rien ce qui permettrait d'afficher le résultat pour trois cas de figure
    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

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Re bonjour,

    Je te remercie pour cette idée mais je reste avec le même problème.

    Comment je fais un sous.total qui me compte les Positifs dans une cellule et les Négatifs dans une autre.

    En fait la colonne que tu me conseilles de créer aura des positifs et des négatifs car je filtre pas en fonction des positifs et / ou négatifs mais en fonction d'autres critères.
    Donc mon filtre aura au minimum 2 des 3 critères (Positifs et Négatifs)

    Je passe donc par la fonction sous.total mais toujours avec ce problème de critère.

    A moins de créer 2 colonnes : une pour les Positifs et une pour les Négatifs ?

    Merci pour ton aide.

    Bonne journée.

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 054
    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 : 13 054
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pense que tu devrais expliquer exactement ce que tu souhaites obtenir car pour ce que j'ai compris, tu as dans une colonne et sur chaque ligne d'un tableau structuré un résultat qui renvoie soit une valeur positive, soit une valeur négative, soit une valeur nulle ou soit encore une chaîne vide. Comme les cellules avec chaîne vides ne sont pas considérées comme nulle, il y a lieu de créer une colonne renvoyant un texte (Positif, Négatif, etc.)

    De cette liste tu souhaites effectuer un filtre piloté par un segment et obtenir une synthèse sur une ou plusieurs colonnes (Somme, moyenne, nombre, etc.)

    Cette synthèse pour ce que j'ai compris doit être visible en bas de la liste et cela c'est automatique à partir du moment où tu ajoutes la ligne des totaux et que tu choisis le type de synthèse souhaité.

    Voilà ce que j'ai compris
    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

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2013
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 356
    Par défaut
    Re,

    J'ai différente colonnes avec des dates, valeurs, montants entrées, montants sortants, ........

    Une colonne nommée PnL calcule la différence entre montants sortants et montants entrants avec cette formule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTVIDE(T16);"0";+[@[Exit_value]]-[@[Entry_value]])
    Le souci de cette formule est que lorsque il n'y a pas de montant sortant, il y a un 0 dans la cellule (Ok pas un drame en soi mais je préfèrerais que la cellule soit vite)

    J'ai donc fait la formule suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(ESTVIDE(T16);"";+[@[Exit_value]]-[@[Entry_value]])
    Du coup, cellule vide à la place du 0, je suis content mais ......


    J'utilise ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =NB.SI((t_trades[PnL]);">0")
    pour compter les PnL positifs de tout le tableau.
    C'est parfait mais je voudrais également que lorsque j'utilise les segments une autre cellule me compte les positifs UNIQUEMENT sur base du filtre (ou segment) que j'ai sélectionné.

    La fonction SOUS.TOTAL ne fonctionne pas vu que je veux y mettre une condition ">0".

    Alors j'ai trouvé le VBA suivant qui compte la cellule positive mais il compte aussi les vides comme une cellule contenant une valeur positive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function CompterPositifs(Plage As Range)
        Dim C As Range
        Application.Volatile
        For Each C In Plage
            If C.EntireRow.Hidden = False And C.Value > 0 Then
                CompterPositifs = CompterPositifs + 1
            End If
        Next C
    End Function
    J'espère que j'ai été clair. Me suis relu 2 fois, ça me semble clair mais bon suis sur le fichier depuis quelques temps

    Merci pour ton aide

Discussions similaires

  1. [XL-2007] Ne pas importer les cellules vides
    Par neomorpheus35 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/06/2017, 01h09
  2. [XL-2013] Compter les cellules vides d'un tableau
    Par Waragnac dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 24/12/2016, 13h04
  3. Calcul : ne pas compter les cellulles vides
    Par romuald.lecordier dans le forum QlikView
    Réponses: 1
    Dernier message: 05/09/2014, 09h49
  4. Réponses: 10
    Dernier message: 16/12/2011, 19h18
  5. [EXCEL][VBA] Compter les cellules non-vides
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2006, 16h40

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