Compter des occurences "texte" multiples et les additionner

amiga69 Messages postés 8 Statut Membre -  
amiga69 Messages postés 8 Statut Membre -
Bonjour,

sur EXCEL 2007, j'ai un tableau de ce type (pour simplifier)

A (applications)
B (serveurs gérant ces applications)
C (serveurs ayant généré des incidents)

je souhaite dans une colonne D : calculer le nombre d'incidents, par application.

Mon souci, c'est qu'avec NB.SI je ne peux remonter q'un seul critère "texte" (ici un Nom de serveur), alors que la majorité des applications ont plusieurs serveurs ... je dois les additionner pour avoir la totalité des incidents pour l'application.

avec SOMME.SI ou BDNBVAL ou autres, je ne trouve pas le principe qui me convient :(
pouvez-vous me donner un coup de main svp ?

6 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    nb.si(...)+ nb.si(...)+...
    ou
    sommeprod(...)
    ou
    TCD (tableau croisé dynamique)
    ou ???

    Difficile d'être plus précis sans fichier.
    cjoint.com et coller le lien fourni ici

    eric
    1
  2. amiga69 Messages postés 8 Statut Membre
     
    Merci Eric déjà pour m'avoir lu, voici un exemple neutre de ce que je cherche à faire :

    https://www.cjoint.com/?BJrmThFVhKn

    ps: le NB.SI + NB.SI peut fonctionner, mais certaines applis (400) ont parfois plus de 10 serveurs ... ce serait des heures et des heures d'usines à Gaz avec cette formule ;)

    Stéphane
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Re,

      Si tu pouvais expliquer pourquoi 4 pour A (alors que A n'est présent que sur 2 lignes) ainsi que les autres résultats stp.
      On a l'impression que c'est la 1ère lettre dans la colonne D, mais elle s'appelle serveurs (?)

      eric

      PS: et 'incidents' c'est un n° (vu que tu as mis de 1 à 9) ou une quantité ?
      0
    2. amiga69 Messages postés 8 Statut Membre
       
      alors,
      # 4 pour "l'application A" car les serveurs liés à l'application A sont présents sur 4 incidents (ici 4 fois A101, colonne D ; ps: l'application A est représentée par 2 serveurs : A101 et A102)
      en effet, en intitulé de colonne, j'aurais dû te précider Qté ... Serveurs (from liste incidents et vis-à-vis de l'app A)

      # oui, c'est bien un numéro, pas une quantité.
      merci
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Ah ok, les colonnes C et D n'ont aucun liens avec A et B. Tu aurais dû mettre une colonne vide de séparation et expliquer...
      Par formules ça risque d'être chaud. Tu n'as rien contre une fonction personnalisée en vba ?

      eric
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Qui ne dit mot consent....

    Une fonction personnalisée à mettre dans un module standard.
    S'utilise comme une autre fonction native d'excel.

    Syntaxe : =nbIncidents(Appli, plage BaseDeDonnées, plage Extraction)
    Paramètres :
    Appli : nom de l'application
    plage BaseDeDonnées : équivalences Applis/Serveurs sur 2 colonnes
    plage Extraction : liste des serveurs ayant généré des incidents sur 1 colonne
    ex : =nbIncidents(G3;$A$3:$B$11;$E$3:$E$11)

    J'ai scindé en 2 fonctions des fois que la 2nde t'intéresse : lister les serveurs pour une appli.
    Syntaxe : =listeServeurs(Appli, BaseDeDonnées)
    Paramètres : idem au-dessus
    Ex : =listeServeurs(G3;$A$3:$B$11)
    Retour : A101-A102

    fichier exemple : https://www.cjoint.com/?BJrtjLeKkdC

    code :
    Function nbIncidents(Appli As String, BaseDeDonnées As Range, Extraction As Range) As Long
        Dim serveurs As Variant, lig As Long, i As Long
        If Extraction.Columns.Count <> 1 Then
            nbIncidents = CVErr(xlErrValue)
            Exit Function
        End If
        serveurs = Split(listeServeurs(Appli, BaseDeDonnées), "-")
        For lig = 1 To Extraction.Rows.Count
            For i = 0 To UBound(serveurs)
                If Extraction.Cells(lig, 1) = serveurs(i) Then
                    nbIncidents = nbIncidents + 1
                    Exit For
                End If
            Next i
        Next lig
    End Function
    
    Function listeServeurs(Appli As String, BaseDeDonnées As Range) As String
        Dim lig As Long
        If BaseDeDonnées.Columns.Count <> 2 Then
            listeServeurs = "Err : La plage 'BaseDeDonnées' doit avoir 2 colonnes."
            Exit Function
        End If
        For lig = 1 To BaseDeDonnées.Rows.Count
            If BaseDeDonnées.Cells(lig, 1) = Appli Then listeServeurs = listeServeurs & "-" & BaseDeDonnées.Cells(lig, 2)
        Next lig
        listeServeurs = Mid(listeServeurs, 2)
    End Function

    eric

    0
    1. amiga69 Messages postés 8 Statut Membre
       
      Désolé, j'étais affairé ailleurs et n'étais plus connecté :)
      Je vais donc essayer cette solution gentiement proposé, je ferais un retour (pas très rapidement, mais je le ferais) ; Merci pour ton aide.
      0
  4. amiga69 Messages postés 8 Statut Membre
     
    Si je n'ouvre pas l'exemple pour éviter toute référence externe, alors ça ne marche pas. Je ne comprends pas pourquoi dans la 1ère fonction il est fait référence à des éléments dont je n'ai pas besoin et qui font planter la fonction (deboggeur)

    ? listeServeurs (ligne 8) --> aucune utilité, mais comme absent sur mon fichier de travail final, il n'aime pas ... en + c'est le bonus, pourquoi y faire appel ici ? (fonction nbIncidents)
    n'étant pas développeur .. je coince :(

    ps: si je laisse ouvert ton exemple, mon vrai fichier de travail y pompe les fonctions et ça marche étrangement ... mais je veux implémenter ton code sans cela.

    source :

    Function nbIncidents(Appli As String, BaseDeDonnées As Range, Extraction As Range) As Long
    Dim serveurs As Variant, lig As Long, i As Long
    If Extraction.Columns.Count <> 1 Then
    nbIncidents = CVErr(xlErrValue)
    Exit Function
    End If
    serveurs = Split(listeServeurs(Appli, BaseDeDonnées), "-")
    For lig = 1 To Extraction.Rows.Count
    For i = 0 To UBound(serveurs)
    If Extraction.Cells(lig, 1) = serveurs(i) Then
    nbIncidents = nbIncidents + 1
    Exit For
    End If
    Next i
    Next lig
    End Function
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour (ça ne mange pas de pain...),

    A vrai dire je n'aime pas trop le ton que tu emploies.

    Si tu n'ouvres pas un fichier avec la fonction personnalisée et que tu ne l'as copiée pas dans ton fichier ça ne marche pas, c'est normal...

    Je ne comprends pas pourquoi dans la 1ère fonction il est fait référence à des éléments dont je n'ai pas besoin
    Ben si, tel que tu l'as expliqué la fonction a besoin de 3 paramètres en entrée.
    A toi d'y mettre les bonnes valeurs ou plages.

    listeServeurs (ligne 8) --> aucune utilité .... en + c'est le bonus, pourquoi y faire appel ici ?
    Si tu sais lire j'ai écris : J'ai scindé en 2 fonctions des fois que la 2nde t'intéresse
    Si tu n'en as pas l'utilité tu ne l'utilises pas, c'est tout.
    C'était un exemple pour te montrer.
    Et pareil que l'autre fonction, si tu ne mets pas les bons paramètres ça ne marchera pas.

    Et ça sera ma dernière contribution dans ce fil, pas envie du tout de passer du temps à faire évoluer, blinder et sécuriser la fonction si c'est pour me faire eng... ensuite.
    Tu as l'essentiel, ça marche très bien sur l'exemple, à toi de l'améliorer comme tu veux.

    Tu as le droit de me dire merci pour ces dernières explications.

    eric

    edit : et pense à te remettre en cause :
    1) est-ce que j'ai tout dit et tout bien expliqué ? Bref, le cahier des charges était-il complet ?
    Sur le tableau que tu as fourni je note que ça marche très bien. Donc ramène-toi dans les conditions que tu as demandé.
    2) est-ce que j'utilise correctement ce qu'on me propose ?

    Quoiqu'il en soit, même si bug il y a, ta façon de dire c'est quoi cette m.... est très désagréable. Tu n'as pas payé pour t'autoriser ça.

    Jamais tu ne répondras à un mp non sollicité...
    Bon, ça c'est fait.
    0
    1. amiga69 Messages postés 8 Statut Membre
       
      Cher Eric, je suis TOUT 0 FAIT navré de t'avoir laissé une telle impression ... mais à me relire, je ne vois absolument rien de mal poli, ne serait-ce un seul adjectif innaproprié ? ... alors encore navré, mais je ne comprends pas ta réaction, je suis scotché béat devant l'écran. : N'aurais-tu pas été contrarié par ailleurs ? car aucune logique dans tes propos à mon égard :( ~

      # pour le Bonjour, ok mais après je ne vais pas le mettre à chaque début de post sur le même sujet, mon 1er mot sur ce post était Bonjour, tu peux le vérifier si tu veux, ensuite ça serait peu fluide à lire pour les googlers en rech de Soluces.
      # Merci : ça aussi déjà fait et je peux le réitérer, je ne suis pas avare de ce côté là ... Ctrl-F friendly.

      Voilà, je suis très agacé par ta réaction, à peu près autant que par la gratitude que j'avais de ton aide, mon seul défaut est de m'être senti peu capable de maîtriser ce Vba et c'est juste ça qui transparait dans mes dernières questions ... dépit envers moi-même, rien d'autre, vraiment.

      alors Merci pour tout tes apports, je vais creuser le reste seul (l'urgence m'a fais passer par les NB.SI+NB.SI mais c'est une horreur pour la suite).

      Un petit conseil à mon tour : attention à vouloir tout (et mal) interpréter, on peut aller vers de graves déconvenue dans la vie (il faut mieux répondre 24H après, c'est une règle cf les mails "chauds" en entreprise, c'est l'Expérience qui parle ;-) ça te servira et tu me remercieras à ton tour).
      0
  7. PHILOU10120 Messages postés 6463 Date d'inscription   Statut Contributeur Dernière intervention   835
     
    Bonjour

    Une solution pas trés compliquée

    https://www.cjoint.com/?3JstOCJzfwj
    0
    1. amiga69 Messages postés 8 Statut Membre
       
      Bonjour Philou10120,

      ça parait d'enfer, merci !
      0
    2. amiga69 Messages postés 8 Statut Membre
       
      Bon en fait non, je suppose que c'est la compréhension de mon projet le souci (ce n'est finalement pas si évident à exprimer clairement, désolé) : la solution sera donc plus complexe avec les fonctions proposés par Ericcc et que je ne maîtrise pas encore dans Excel .. mais on va y travailler.
      0