Bonjour le fil, bonjour le forum,
En pièce jointe ton fichier modifié avec l'événementielle Change ci-dessous :
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim OL As Worksheet 'déclare la variable OL (Onglet Liste)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Set OL = Worksheets("LISTE") 'définit l'onglet OL
Set TS = OL.ListObjects("Tableau3") 'définit le tableau structuré TS
If Target.Address <> "$B$4" Then Exit Sub 'si le changement a lieu ailleurs qu'en B4 (la cible), sort de la procédure
Me.Range("B3").ClearContents 'efface B3
Me.Range("B5:C" & Application.Rows.Count).ClearContents 'efface la plage B5:C...
If Target.Value = "" Then Exit Sub 'si la cible est effacée, sort de la procédure
For I = 1 To TS.ListColumns.Count 'boucle sur toutes les colonnes I du tableau structuré TS
If TS.HeaderRowRange(1, I).Value = Target.Value Then 'si l'en-tête de TS colonne I est égal à la cible
Me.Range("B3").Value = TS.DataBodyRange(I, 1).Value 'renvoie dans B3 la donnée de TS ligne 1 colonne I
DL = TS.HeaderRowRange(I, 1).End(xlDown).Row 'définit la dernière ligne éditée de la colonne I de TS
'renvoie dans B5 les données de la colonne I de TS, en partant de la ligne 3
Me.Range("B5").Resize(DL - 2, 1).Value = OL.Range(OL.Cells(3, I), OL.Cells(DL, I)).Value
Exit For 'sort de la boucle
End If 'fin de la condition
Next I 'prochaine colonne de la boucle
DL = Me.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée de la colonne B
For I = 5 To DL 'boucle sur toutes les lignes I de 5 à DL
'renvoie dans la ligne I colonne C, le nombre de fois que la valeur ligne I colonne B apparaît dans TS
Me.Cells(I, "C").Value = Application.WorksheetFunction.CountIf(TS.DataBodyRange, Me.Cells(I, "B"))
Next I 'prochaine ligne de la boucle
End Sub
Le fichier :
[Édition]
Il y a une petite erreur dans le code, remplace la ligne :
Me.Range("B3").Value = TS.DataBodyRange(I, 1).Value 'renvoie dans B3 la donnée de TS ligne 1 colonne I
par :
Me.Range("B3").Value = TS.DataBodyRange(1, I).Value 'renvoie dans B3 la donnée de TS ligne 1 colonne I
Inversion du I et du 1...
Le bon fichier :