Comptabiliser en fonctions de plusieurs éléments

bonjour
dans le fichier "TEST" ci joint j'aimerais pouvoir compter:
Combien de POR851 (ou autre) de la colonne E qui a pour résultat INCIDENT dans la colonne A
CONTRESENS
Idem combien pour POR825 ou autre numéro

merci

9test.xlsx (10.69 Ko)

Bonjour à toutes et tous,

@ggibier,

A tester avec une colonne "L" supplémentaire qui peut-être masquée.

3ggibier.xlsx (12.80 Ko)

Cdlt

bonjour

un essai malgrè les apparences ,la formule est matricielle donc nessécite une validation avec les 3 touches (Ctrl Maj Entrée) en simultané en N9 avant duplication

6ggibier.xlsx (11.09 Ko)

Un essai en VBA

4test.xlsm (20.70 Ko)

@tulipe_4,

Bien vu, quand y faut, y faut je parle ben entendu d'une formule matricielle.

@Optimix,

Bien vu le code VBA, mais quant-est-il si il y a "POR800" par exemple, faut modifier la macro, ce n'est pas très souple comme solution.

Impossible à deviner. Un mini-cahier des charges serait le bienvenu.

Bonjour le fil, bonjour le forum,

Je ne sais pas si je demande un contrôle anti dopage ou si je reprends mes vitamines ?!... Bon Ok, je reprends mes vitamines...

Une autre proposition VBA différente de celle d'Optimix. Je ne comprend pas l'intérêt de faire si simple quand on peut faire tellement plus compliqué .

Le code :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim NS As Byte 'déclare la variable NS (nombre de Slash)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim D1 As Object 'déclare la variable O (Dictionnaire 1)
Dim D2 As Object 'déclare la variable O (Dictionnaire 2)

Set O = Worksheets("Feuil1") 'définit l'onglet 1
TV = O.Range("A3").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
Set D1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D1
Set D2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D2
For I = 1 To UBound(TV, 1) Step 2 'boucle sur toutes les lignes I du tableau des valeurs par pas de deux
    If UBound(Split(TV(I, 5), "/")) > 0 Then 'condition : si il existe un slash dans la donnée ligne I colonne 5 de TV
        NS = UBound(Split(TV(I, 5), "/")) 'définit la nombre de slash NS dans la donnée ligne I colonne 5 de TV
        D(Split(TV(I, 5), "/")(NS)) = "" 'alimente le dictionaire D avec le texte après le dernier slash de la donnée ligne I colonne 5 de TV (la clé)
        Select Case TV(I + 1, 1) 'agit en fonction de la donnée ligne I+1 colonne 1 de TV
            Case "INCIDENT" 'cas
                    D1(Split(TV(I, 5), "/")(NS)) = D1(Split(TV(I, 5), "/")(NS)) + 1 'alimente le dictionaire D1 avec le nombre de fois que le texte après le dernier slash de la donnée ligne I colonne 5 de TV apparaît (l'Item)
            Case "CONTRESENS" 'cas
                    D2(Split(TV(I, 5), "/")(NS)) = D2(Split(TV(I, 5), "/")(NS)) + 1 'alimente le dictionaire D2 avec le nombre de fois que le texte après le dernier slash de la donnée ligne I colonne 5 de TV apparaît (l'Item)
        End Select 'fin de l'action en fonction de la donnée ligne I+1 colonne 1 de TV
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle (par pas de deux)
O.Range("M9:O12").ClearContents 'efface le contenu de la plage M9:O12
O.Range("M9").Resize(D.Count) = Application.Transpose(D.KEYS) 'renvoie les clés du dictionnire D en M9 redimensionnée
O.Range("N9").Resize(D1.Count) = Application.Transpose(D1.Items) 'renvoie les items du dictionnire D1 en N9 redimensionnée
O.Range("O9").Resize(D2.Count) = Application.Transpose(D2.Items) 'renvoie les items du dictionnire D2 en O9 redimensionnée
End Sub

Le fichier :

Bonjour ThauThème,

C'est vrai tu peux faire compliquer Mais toujours avec les commentaires qui vont bien.

On peut ajouter autant de "PORxxx" que l'on veut, mais quand on efface la plage "M9:O12" ça n'efface pas les nouvelles lignes du petit tableau..

O.Range("M9:O12").ClearContents

Bien sûr on peut dans ce cas modifier cette ligne de code par:

O.Range("M9:O500").ClearContents

Mais comment pourrait-on modifier cette ligne de code pour effacer de "M9, jusqu'à la dernière ligne pleine"

Merci d'avance pour ta réponse.

Re,

On pourrait faire vite avec (une ligne de plus que la dernière) :

O.Range("M8").CurrentRegion.Offset(1, 0).ClearContents

Pour peaufiner il faudrait aussi gérer la mise en forme mais comme le dit Optimix, sans cahier des charges pas trop envie de peaufiner non plus...

Rechercher des sujets similaires à "comptabiliser fonctions elements"