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 :