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 ?

A voir également:

6 réponses

eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
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
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
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
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
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
PHILOU10120 Messages postés 6515 Date d'inscription   Statut Contributeur Dernière intervention   827
 
Bonjour

Une solution pas trés compliquée

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

ça parait d'enfer, merci !
0
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