web-dev-qa-db-fra.com

Compter les lignes avec une valeur non vide

Dans une feuille de calcul Google: Comment compter les lignes d'une zone donnée qui ont une valeur? Toutes les allusions à ce sujet que j’ai trouvées jusqu’à présent conduisent à des formules qui comptent les lignes dont le contenu n’est pas vide (y compris la formule), mais une cellule contenant 

=IF(1=2;"";"")  // Shows an empty cell

est compté aussi bien.

Quelle est la solution à cette tâche simple?

67
Robbit

Je viens d'utiliser =COUNTIF(Range, "<>") et cela comptait les cellules non vides pour moi. 

113
Mike
=counta(range) 
  • counta: "Retourne le nombre de values ​​ dans un jeu de données"

    Remarque: CountA considère que "" est un valeur. Seules les cellules vides (appuyez sur la touche Suppr d'une cellule pour la supprimer) ne sont pas comptées. 

    Assistance Google: https://support.google.com/docs/answer/3093991

  • countblank: "Retourne le nombre de cellules empty dans une plage donnée"

    Remarque: CountBlank considère à la fois les cellules vides (appuyez sur la touche Suppr pour supprimer une cellule) et les cellules dont la formule renvoie "" à empty.

    Support Google: https://support.google.com/docs/answer/3093403

Si vous avez une plage qui inclut des formules aboutissant à "", vous pouvez modifier votre formule à partir de

=counta(range)

à:

=Counta(range) - Countblank(range)

EDIT: la fonction est countblank, pas countblanks, ce dernier donnera une erreur.

71
Delta_zulu

Voici ce que je crois être la meilleure solution jusqu'à présent:

=CountIf(ArrayFormula(range<>""),TRUE)

Voici pourquoi en 3 étapes faciles

Étape 1: Simple comme tarte - Ajouter une colonne supplémentaire

Le answer de eniacAvenger donnera la solution correcte sans se soucier des cas Edge, car =A1<>"" semble parvenir à la valeur vérité/falsification correcte en fonction de la façon dont nous pensons intuitivement aux cellules vides, vierges ou créées. 

Alors imaginons que nous avons ces données et que nous voulons le nombre de non-blancs dans B2:B6:

|   |      A      |   B   |    C    |
|---|-------------|-------|---------|
| 1 | Description | Value | B1<>""  |
| 2 | Text        | H     | TRUE    |
| 3 | Number      | 1     | TRUE    |
| 4 | IF -> ""    |       | FALSE   |
| 5 | IF -> Text  | h     | TRUE    |
| 6 | Blank       |       | FALSE   |

Si nous nous appuyions sur Column C, nous pourrions obtenir le nombre de valeurs dans B comme ceci:

=COUNTIF(C2:C6,True)

Étape 2: Utilisez FormulaArray pour créer de manière dynamique une colonne supplémentaire

Cependant, le commentaire de consideRatio est valide - si vous avez besoin d'une colonne supplémentaire, vous pouvez souvent atteindre le même objectif avec une variable ArrayFormula qui peut créer une colonne en mémoire sans perdre de l'espace.

Donc, si nous voulons créer C dynamiquement, nous pouvons utiliser une formule matricielle comme celle-ci:

=ArrayFormula(B2:B6<>"")

Si nous le mettons simplement en C2, cela créerait le tableau vertical avec un seul trait de plume:

|   |      A      |   B   |    C                     |
|---|-------------|-------|--------------------------|
| 1 | Description | Value | =ArrayFormula(B2:B6<>"") |
| 2 | Text        | H     | TRUE                     |
| 3 | Number      | 1     | TRUE                     |
| 4 | IF -> ""    |       | FALSE                    |
| 5 | IF -> Text  | h     | TRUE                     |
| 6 | Blank       |       | FALSE                    |

Étape 3: Compter les valeurs dans la colonne dynamique

Mais avec cela résolu, nous n’avons plus besoin de la colonne pour simplement afficher les valeurs.

ArrayFormula résoudra à la plage suivante: {True,True,False,True,False}.
CountIf ne prend que n'importe quelle plage et peut compter le nombre de valeurs True.

Donc nous pouvons envelopper CountIf autour des valeurs produites par ArrayFormula comme ceci:

=CountIf(ArrayFormula(B2:B6<>""),TRUE)

Lectures complémentaires

Les autres solutions de ce thread sont soit trop complexes, soit échouent dans des cas Edge particuliers que j'ai énumérés dans cette feuille de test:

Feuille de calcul Google - Test CountA - Démo

Pourquoi CountA fonctionne-t-il de la même façon, voir ma réponse ici

23
KyleMit

Résolu à l'aide d'une solution trouvée par Google sur Google, par Yogi Anand: https://productforums.google.com/d/msg/docs/3qsR2m-1Xx8/sSU6Z6NYLOcJ

L'exemple ci-dessous compte le nombre de lignes non vides de la plage A3: C. N'oubliez pas de mettre à jour les deux plages de la formule avec votre plage d'intérêt.

=ArrayFormula(SUM(SIGN(MMULT(LEN(A3:C), TRANSPOSE(SIGN(COLUMN(A3:C)))))))

Veillez également à éviter les dépendances circulaires, par exemple si vous comptez le nombre de lignes non vides dans A: C et placez cette formule dans la colonne A ou C.

6
consideRatio

Une solution plus simple qui fonctionne pour moi:

=COUNTIFS(A:A;"<>"&"")

Il compte les nombres, les chaînes, les dates, etc. qui ne sont pas vides

5
user300905

Étant donné la plage A:A, Id suggère:

=COUNTA(A:A)-(COUNTIF(A:A,"*")-COUNTIF(A:A,"?*"))

Le problème est que COUNTA comptabilise le nombre exact de cellules avec des chaînes de longueur nulle "".

La solution consiste à trouver le nombre exact de ces cellules. Cela peut être trouvé en recherchant toutes les cellules de texte et en soustrayant toutes les cellules de texte avec au moins un caractère

  • COUNTA (A: A): cellules avec valeur, y compris "" mais excluant les cellules vraiment vides
  • COUNTIF (A: A, "*"): cellules reconnues en tant que texte, comprenant "" mais excluant les cellules vraiment vides
  • COUNTIF (A: A, "? *"): Cellules reconnues comme texte avec au moins un caractère

Cela signifie que la valeur COUNTIF(A:A,"*")-COUNTIF(A:A,"?*") doit correspondre au nombre de cellules de texte moins le nombre de cellules de texte comportant au moins un caractère, c'est-à-dire le nombre de cellules contenant exactement "".

3
spacepickle

Autant que je sache, la plupart des solutions ici comptent le nombre de cellules non vides, et non le nombre de lignes contenant des cellules non vides.

Une solution possible pour la plage B3:E29 est par exemple 

=SUM(ArrayFormula(IF(B3:B29&C3:C29&D3:D29&E3:E29="";0;1)))

Ici, ArrayFormula(IF(B3:B29&C3:C29&D3:D29&E3:E29="";0;1)) renvoie une colonne de 0 (si la ligne est vide) et de 1 (else). 

Un autre est donné dans la réponse de consideRatio .

1
Kpym

Dans Google Sheets, compter le nombre de lignes contenant au moins une cellule non vide dans une plage à deux dimensions :

=ARRAYFORMULA(
  SUM(
    N(
      MMULT(
        N(A1:C5<>""),
        TRANSPOSE(COLUMN(A1:C5)^0)
      )
      >0
    )
  )
)

Où A1: C5 est la plage que vous recherchez pour les lignes non vides.

La formule provient de, et est expliquée dans l'article suivant de EXCELXOR - https://excelxor.com/2015/03/30/counting-rows-where-at-least-one-condition-is-met /

1
Will Rice

C'est un travail pour moi:

=SUMPRODUCT(NOT(ISBLANK(F2:F)))

Nombre de cellules non vides de F2 à fin de la colonne

1
nomnom

ARRAYFORMULA est un moyen très flexible de faire ce genre de choses.

A titre d'exemple, imaginez que vous souhaitiez compter des chaînes non vides (champs de texte), vous pouvez utiliser ce code:

=ARRAYFORMULA(SUM(IF(Len(B3:B14)>0, 1, 0)))

Ce qui se passe ici, c'est que "ArrayFormula" vous permet d'opérer sur un ensemble de valeurs. En utilisant la fonction SUM, vous indiquez "ArrayFormula" pour additionner toute valeur de l'ensemble. La clause "Si" sert uniquement à cocher "vide" ou "pas vide", 1 pour non vide et 0 sinon. "Len" renvoie la longueur des différents champs de texte. C'est là que vous définissez le jeu que vous voulez vérifier. Enfin, "ArrayFormula" totalisera 1 pour chaque champ de la série dans laquelle "len" renvoie plus de 0.

Si vous souhaitez vérifier toute autre condition, modifiez simplement le premier argument de la clause IF.

0
Pablo

Vous pouvez définir une fonction personnalisée à l'aide du script Apps (Outils> Editeur de script) appelé par exemple numNonEmptyRows:

function numNonEmptyRows(range) {
  Logger.log("inside");
  Logger.log(range);
  if (range && range.constructor === Array) {
    return range.map(function(a){return a.join('')}).filter(Boolean).length
  }
  else {
    return range ? 1 : 0;
  }
}

Puis utilisez-le dans une cellule comme celle-ci =numNonEmptyRows(A23:C25) pour compter le nombre de lignes non vides dans la plage A23:C25;

0
Kpym