Compter le nombre de cellules non vides avec NB.SI

Bonjour,

Je cherche à compter le nombre de cellules non vides dans un fichier tout simple (liste de nom dont la taille n’est pas fixe, liste de notes sous forme de lettres (A,B, …)).

J’ai trouvé un début de solution datant d’une époque sans doute révolue, et en plus pour un autre logiciel :
OpenOffice

J’ai donc consulté l’aide de LibreOffice sur les expressions régulières et je ne la comprends pas

Permet de trouver le caractère zéro ou l'un des caractères se trouvant avant "*"

Apparemment, les exemples donnés impliquent la notion de répétition (auquel je pouvais m’attendre, concernant le caractère de remplacement “*”, utilisé ailleurs en informatique), ce que ne précise pas la formulation en français ; de même pour “+” et “?”, mais je ne m’y suis pas attardé.

J’ai donc repris et adapté l’exemple utilisé dans l’article sus-cité et j’essaie d’interpréter le résultat.

Est-ce que quelqu’un pourrais me confirmer dans mon raisonnement ou bien le corriger, et m’expliquer la différence entre “caractère zéro”, “caractère nul”, “chaîne nulle”? Je comprends juste que la formule D n’utilise pas d’expression régulière.

Dans mon cas, je m’accommoderai indifféremment des formules A ou D, mais j’aimerais comprendre la subtilité !

Bonjour,
Pour trouver le nombre de cellules non vides dans une plage, la fonction =NBVAL(A2:A11) s’acquitte très bien de la tâche…
Si tu tapes=""dans une cellule, NBVAL va l’interpréter comme une valeur, tandis que le résultat de `=NB.SI(A2:A11;"")’ ne va pas varier… (fais le test…)
Cordialement
Didier

Bonjour @RodrigueM

Très intéressante question !

Les formules indiquées dans l’exemple numérique ne donnaient pas les mêmes résultats chez moi avec LO 6.4.6.2. Je trouvais respectivement 10, rien, 6 et 4 au lieu de 3, 7, 6 et 4. J’ai modifié les Outils>Options>LibreOffice Calc>Calcul en cochant Autoriser les expressions régulières dans les formulespour Caractères génériques dans les formules au lieu de Autoriser les caractères génériques dans les formules et je retrouve vos résultats.

Les expressions régulières utilisées dans LO sont détaillées sur cette page de l’aide en ligne. Je n’y trouve pas mention de l’expression “caractère zéro”. Elles découlent de l’implémentation de ICU dans LO.

Avec la fonction NB.SI, le filtre peut ne pas comporter d’opérateur; alors l’opérateur est supposé être “=”.

La chaîne ".*" recherche une chaîne comportant n’importe quel caractère avec le . en n’importe quelle quantité avec le *. Il peut y avoir 0 ou plus de n’importe quel caractère.

Le critère “<>.*” mélange l’opérateur <>, différent de et l’expression régulière .*

Dans le fichier content.xml où Calc mémorise les formules, les constantes et les valeurs calculées avant sauvegarde, les cellules vides de texte, de valeur ou de formule sont simplement “sautées”. Alors que les cellules qui contiennent, comme résultat, une chaîne vide, c’est-à-dire une chaîne de longueur nulle, autrement notée “”, sont mémorisées en tant que telles. Sur cette base, Calc fait très bien la différence entre une cellule vide et une cellule qui contient une chaîne de longueur nulle. (La même différence entre NULL et une chaîne de longueur nulle en base de données.)

Ensuite,il faut se reporter aux spécificités de chaque fonction, telle que présentées dans les différents guides et tutoriels…

Dans le cas présent, NB.SI(plage;"") ne fait pas la différence entre une cellule vide et une cellule contenant une cellule vide, puisque =NB.SI(A2:A11;"") compte aussi bien les 3 cellules vides A5, A6 et A10 que la cellule dont la formule a comme résultat momentané une chaîne vide : A7.

Alors que NB.SI(plage;“expression régulière”) fait cette différence : la formule A qui est sensée trouver le même résultat que la formule D ne le fait pas : elle considère que A7 n’est pas une cellule vide et fournit seulement 3 comme résultat.

Chaque fois qu’une fonction implémentée existe, comme celle présentée par @Didier_Excel_LibO elle est préférable, pour le non-expert, à l’emploi des expressions régulières, auxquelles il ne fera appel qu’en dernier recours. A condition de bien maîtriser ces fonctions implémentées !


Pour montrer à la communauté que la question a trouvé sa réponse, cliquez sur ✓ à côté de la “bonne” réponse, et “votez” en cliquant sur la flèche ^ de toute réponse utile. Ce sont les mécanismes utilisés pour communiquer la qualité des questions et réponses sur ce site. Merci!

Pour tout complément d’information, utilisez les boutons situés en dessous de votre question et éditez votre question ou simplement ajouter un commentaire. SVP ! Ne répondez pas à votre propre question à moins d’y apporter une réelle réponse.

Cordialement, Michel

Merci à tous deux !

Tout d’abord, vous aurez remarqué sur l’image que j’ai oublié d’actualiser les commentaires en cellules B7 et B11, après avoir préparé ma copie d’écran…

Effectivement, j’ai pu vérifié que NBVAL(plage) fait la distinction entre cellule vide et cellule dont le contenu est une chaîne nulle, et donc équivalent à la formule B dans mon exemple. Vu que je ne compte pas avoir de chaînes nulles, cela fera parfaitement le travail.

Je comprends bien mieux comment NB.SI utilise les expressions régulières (et la syntaxe utilisée par Libre Office).

Cependant, je persiste à penser que l’article de l’aide sur les expressions régulières est soit mal formulé (ou traduit), soit considère que l’utilisateur à déjà de bonnes connaissances en la matière :

  1. J’y lis le terme “caractère zéro”, que j’ai incorrectement interprété par “caractère nul” ;
  2. Il n’est pas précisé que que les caractères “" et “?” qui sont je crois des caractères de remplacement, s’appliquent également uniquement au caractère (ou à l’expression) précédente, mais il est vrai que mon niveau m’empêche d’être catégorique. Quand je lis : “l’un des caractères se trouvant avant "”, je m’attends par exemple à ce que “Ab*c” puisse trouver “AbAc” si vous voyez ce que je veux dire.

Mais grâce à vos précisions, je comprends maintenant ce que tout cela veut dire, et par exemple comprendre qu’il s’agit du “caractère ou de l’expression se trouvant immédiatement avant”, et que le caractère “zéro” joue le rôle d’ “effacement arrière”.

Bonjour @RodrigueM

Je n’avais pas observé de discordance entre l’image et les commentaires en B7 et B11. Pour vous simplifier la vie, il est utile d’employer la fonction B7=FORMULE(A7)

Quelle version de LO, SVP ? Je n’ai pas la même version de l’aide en ligne. Pour la version 6.4, les textes sont les suivants :

  • : Zéro ou plusieurs termes d’expressions régulières le précédent immédiatement. Par exemple “Ab*c” trouve “Ac”, “Abc”, “Abbc”, “Abbbc”, et ainsi de suite.

? : Zéro ou plusieurs termes d’expressions régulières le précédent immédiatement. Par exemple “Textes?” trouve “Texte” et “Textes” et “x(ab|c)?y” trouve “xy”, “xaby”, ou “xcy”.

Belle journée, Michel

Veuillez excuser cette réponse tardive.

Les commentaires en B7 et B11 devraient référer aux cellules A4 et A8 (6 = 3*2).
Ma version de LO est 6.1.5.2, celle proposée par une distribution Mageia 6 tenue à jour. En effet, votre aide en ligne correspond mieux à la fonction (“zéro ou plusieurs termes” au lieu de “le caractère zéro ou l’un des caractères”).

Je pense que ce que je ne comprends pas est qu’une expression régulière puisse (sembler) également inclure le caractère nul :

  • “Abc" trouve “Abc” ou “Abbc”, je comprends (“Ab” + 0/nul ou le caractère précédent "” (=“b”, “bb”, “bbb”, …) + “c”) ;
  • “Abc" trouve “Ac”, je ne comprends pas : en langage C, "” a un sens particulier, et j’ai appris ici qu’il s’applique à la ou les valeurs de l’expression régulière immédiatement précédente (éventuellement en plusieurs exemplaires), mais apparemment, c’est (b*) qui correspond à la description et non () :
    (“A” + 0/nul ou le caractère précédent "
    " (=“b”, “bb”, “bbb”, …) + “c”.

Bonjour Rodrigue M

L’aide citée mentionne un * qui a disparu de votre commentaire. L’astérisque qui suit le b dans "Ab*c indique que l’on accepte n’importe quel nombre de b, même aucun.

Cordialement, Michel

Bonjour Michel,
Votre dernier message m’a fait comprendre la source de mon incompréhension: ‘le caractère zéro ou l’un des caractères se trouvant avant ""*’ C’est peut-être du pinaillage, mais comme l’expression ‘l’un des caractères’ appelle nécessairement un qualificatif pour en préciser le sens, j’ai lu la suite comme se référant exclusivement à cette expression, alors qu’elle est censée qualifier également 'le caractère zéro !. Apparemment, je n’ai pas été le seul à me faire piéger, puisque la formulation a changé entre 6.1.5.2 et 6.4.

Mais même ainsi… comment expliquer que “Textes*” donne “Texte” à quelqu’un débutant avec les expressions régulières sans parler de “remplacement” comme dans les définitions des caractères joker en C ?

Permet de remplacer l’expression régulière précédant "” par le caractère zéro ou l’une de valeurs de l’expression, une ou plusieurs fois.*" Là, j’aurais compris !