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

OpenOffice & LibreOffice Discussion :

NB.SI.ENS avec condition complexe, possible ?


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre à l'essai
    NB.SI.ENS avec condition complexe, possible ?
    Bonjour,

    J'utilise la formule NB.SI.ENS habituellement et tout se passe bien mais elle ne semble pas fonctionner dès que la condition est plus complexe.
    Par exemple, dans mon fichier test, cela ne fonctionne pas du tout.
    En fait, je ne veux surtout pas passer par un sommeprod, bien trop coûteux en temps processeur, mon fichier de travail présentant 100000 observations sur 5 onglets, ça prend des heures ...
    J'expliuqe ici mais ça sera plus simple dans mon fichier test :

    variable
    1AAAAAA
    1AAAAAA
    2BBBBBB
    3CCCCCC
    3CCCCCC
    4DDDDDD
    5EEEEEE
    4DDDDDD
    1AAAAAA
    6AAAAAA

    Je veux compter le nombre de lignes différentes dont les 6 derniers caractères de ma variable sont "AAAAAA", "BBBBBB", "CCCCCC", etc.
    Soit pour AAAAAA : 2, BBBBBB : 1, CCCCCC : 1

    Merci pour votre aide.

    Cordialement.

  2. #2
    Membre éclairé
    Bonjour alucard_xs,

    Testez avec la formule ci-dessous:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI($Feuille2.$A$2:$A$10;"*"&$A2)

    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  3. #3
    Membre à l'essai
    Merci pour votre répondre mais hélas ça ne fonctionne pas comme je le voudrais.
    avec votre formule, pour le cas "AAAAAA", ça m'indique 4 au lieu de 2 (dans l'exemple de mon post).

  4. #4
    Membre éclairé
    Personnellement j'en voie bien 4, les deux premiers et les deux derniers
    variable
    1AAAAAA
    1AAAAAA
    2BBBBBB
    3CCCCCC
    3CCCCCC
    4DDDDDD
    5EEEEEE
    4DDDDDD
    1AAAAAA
    6AAAAAA
    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  5. #5
    Membre à l'essai
    Citation Envoyé par njhub Voir le message
    Personnellement j'en voie bien 4, les deux premiers et les deux derniers

    "Je veux compter le nombre de lignes différentes dont les 6 derniers caractères de ma variable sont "AAAAAA", "BBBBBB", "CCCCCC", etc."

    1AAAAAA
    1AAAAAA
    1AAAAAA
    6AAAAAA

    Soit que deux types de lignes différentes.

  6. #6
    Membre éclairé
    Bonjour alucard_xs,

    Testez avec la formule ci-dessous dans une colonne supplémentaire en A:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =SI(ESTNUM(EQUIV(Feuille2.A2;Feuille2.A$1:Feuille2.A1;0));"";Feuille2.A2)

    en B votre liste
    en C :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI(A2:A11;"*"&$B2)


    comptage
    AAAAAA 2
    BBBBBB 1
    CCCCCC 1
    DDDDDD 1
    EEEEEE 1
    LibreOffice 6.3.5.2 (x64) FR-YT 07-03-20
    OS : Windows 10.0

  7. #7
    Membre à l'essai
    Bonjour
    Citation Envoyé par alucard_xs Voir le message
    J'utilise la formule NB.SI.ENS habituellement.
    Dans ce cas, tu dois savoir que NB.SI.ENS() prolonge NB.SI dans le cas où il y a plusieurs plages à tester : elle renvoie le nombre de cas qui satisfont toutes les conditions (comme un ET). Or dans l'exemple de ton fichier joint, tu utilises un nombre impair d'arguments pour NB.SI.ENS() qui doit toujours avoir un nombre pair (plage; critère; plage; critère;etc.) ce qui explique l'erreur 511, ce n'est pas dû à la complexité de ce que tu lui demandes.
    Par exemple, en B2 de la feuille Comptage, au lieu de :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI.ENS($Feuille2.$A$2:$A$10;DROITE($Feuille2.$A$2:$A$10;6);$A2)
    tu aurais dû mettre :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI.ENS(DROITE($Feuille2.$A$2:$A$10;6);$A2)
    Seulement, comme tu utilises la fonction DROITE(), qui n'est pas naturellement matricielle, tu dois valider la formule en matriciel, par Ctrl+Maj+Entrée. Je comprends que tu puisses vouloir utiliser la fonction DROITE() si tu ne veux pas utiliser les expressions régulières dans les formules (par exemple si tu as des chaînes de texte avec des caractères spéciaux) mais si ça n'est pas le cas, tu aurais tout intérêt à utiliser la formule :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI.ENS($Feuille2.$A$2:$A$10;".?"&$A2)
    qui elle ne nécessite pas de validation matricielle. Et, tant qu'on y est, puisqu'il n'y as qu'une seule plage testée par formule, tu peux oublier NB.SI.ENS et revenir à NB.SI , que ce soit en matriciel avec DROITE :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI(DROITE($Feuille2.$A$2:$A$10;6);$A2)
    ou sans matriciel avec les expressions régulières :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =NB.SI($Feuille2.$A$2:$A$10;".?"&$A2)
    Cordialement,
    Pekoe

  8. #8
    Membre à l'essai
    Merci beaucoup pour l'ensemble de vos réponses.
    La dernière va au-delà de ce que j'attendais, et je constate que je ne maîtrise pas si bien que cela cette fonction.
    Par contre, testé avec mon fichier et on m'affiche 0.

    Merci

  9. #9
    Membre à l'essai
    Citation Envoyé par Pekoe
    avec les expressions régulières
    Outils > Options >LibreOffice Calc > Calcul > cocher Autoriser les expressions régulières dans les formules.
    Cordialement

  10. #10
    Membre à l'essai
    merci, je ne connaissais pas non plus cela.
    Mais le comptage n'est toujours pas le bon avec l'expression régulière.

    en entrée :

    1AAAAAA
    1AAAAAA
    2BBBBBB
    3CCCCCC
    3CCCCCC
    4DDDDDD
    5EEEEEE
    4DDDDDD
    1AAAAAA

    comptage
    AAAAAA 3 (au lieu de 1 car j'ai 3 fois la même ligne et moi je veux le nombre de lignes distinctes par code "AAAAAA","BBBBBB", etc.

  11. #11
    Membre à l'essai
    Bonjour,
    Désolé, je n'avais pas compris que tu voulais faire un comptage sans doublon.
    Une solution en B2 du fichier joint :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    =SOMME(1/NB.SI(SI(DROITE($Feuille2.$A$2:$A$10;6)=$A2;$Feuille2.$A$2:$A$10;1);SI(DROITE($Feuille2.$A$2:$A$10;6)=$A2;$Feuille2.$A$2:$A$10;1)))-1
    matricielle.
    Remarques : à tester en fonction du temps de calcul, dès qu'il s'agit de tout balayer pour rechercher les doublons... c'est long !
    J'ai mis 1 dans la fonction SI() pour éviter une division par zéro dans la partie 1/NB.SI(), comme ce 1 est une nouvelle valeur, je décrémente en fin de formule avec -1.

    Cordialement,

  12. #12
    Expert confirmé
    hello,
    au cas où l'utilisation d'une macro n'est pas rédhibitoire, il y a possibilité avec des tableaux d'utiliser la puissance du python en passant par l'extension EasyDev
    Dans ce cas pas la peine d'utiliser une feuille intermédiaire.



    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    Membre à l'essai
    Merci, par contre, question bête, comment vous faites pour faire incrémenter automatiquement la variable A2 du la partie, par exemple, de la formule :

    DROITE($Feuille2.$A$2:$A$20;6)=$A2 ?

    En descendant la formule, elle reste figée à A2 et ne passe jamais, à A3, A4, etc.

  14. #14
    Membre à l'essai
    Citation Envoyé par jurassic pork Voir le message
    hello,
    au cas où l'utilisation d'une macro n'est pas rédhibitoire, il y a possibilité avec des tableaux d'utiliser la puissance du python en passant par l'extension EasyDev
    Dans ce cas pas la peine d'utiliser une feuille intermédiaire.



    Ami calmant, J.P
    Bonjour et merci au passage !!!

  15. #15
    Membre à l'essai
    Bonjour,
    Citation Envoyé par alucard_xs Voir le message
    comment vous faites pour faire incrémenter automatiquement la variable A2 du la partie, par exemple, de la formule :
    DROITE($Feuille2.$A$2:$A$20;6)=$A2 ? En descendant la formule, elle reste figée à A2 et ne passe jamais, à A3, A4, etc.
    Pour copier une formule matricielle vers le bas, il suffit de mettre le pointeur de la souris sur le coin inférieur droit de la cellule (le pointeur prend la forme d'une croix) et de copier-glisser vers le bas en maintenant la touche Ctrl enfoncée. Une autre solution consiste à copier la cellule d'origine, à sélectionner les autres cellules et à coller.
    Cordialement,