Private dl As Integer 'déclare la variable dl(Dernière Ligne)
Private pl As Range 'déclare la variable pl(PLage)
Private d As Object 'déclare la variable d(Dictionnaire)
Private cel As Range 'déclare la variable cel(CELlule)
Private tt() As Variant 'déclare la variable tt (Tableau Temporaire)
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'au changement de sélection dans l'onglet
If Target.Address <> "$A$3" Then Exit Sub 'si la cellule active est différente de A3, sort de la procédure
With Sheets("Tables") 'prend en compte l'onglet "Tables"
dl = .Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne dl de la colonne 3 (=C)
Set pl = .Range("C4:C" & dl) 'définit la plage pl
Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
d(cel.Value) = "" 'alimente le dictionnaire d
Next cel 'prochaine cellule de la boucle
ReDim tt(d.Count) 'dimensionne le tableau tt()
tt = d.keys 'récupère le dictionnaire sans doublon dans le tableau temporaire tt
With Target.Validation 'prend en compte la validation de données de la cellule A3
.Delete 'efface une éventuelle ancienne validation de données
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Join(tt(), ",") 'utilise la liste des éléments du tableau tt comme validation de données
End With 'fin de la prose en compte de...
End With 'fin de la prise en compte de l'onglet "Tables"
Erase tt() 'efface le tableau tt
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
If Target.Address <> "$A$3" Then Exit Sub 'si la cellule active est différente de A3, sort de la procédure
If Target.Value = "" Then Target.Offset(1, 0) = "": Exit Sub 'si A3 est effacée, efface A4, sort de procédure
Target.Offset(1, 0) = "" 'efface la cellule A4
With Sheets("Tables") 'prend en compte l'onglet "Tables"
dl = .Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne dl de la colonne 3 (=C)
Set pl = .Range("C4:C" & dl) 'définit la plage pl
.Range("B3").AutoFilter Field:=2, Criteria1:=CStr(Target.Value) 'filtre avec la valeur de A3 comme critère
Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
For Each cel In pl.SpecialCells(xlCellTypeVisible) 'boucle sur toutes les cellules visibles cel de la plage pl
d(cel.Offset(0, -1).Value) = "" 'alimente le dictionnaire d
Next cel 'prochaine cellule de la boucle
ReDim tt(d.Count) 'dimensionne le tableau tt()
tt = d.keys 'récupère le dictionnaire sans doublon dans le tableau temporaire tt
With Target.Offset(1, 0).Validation 'prend en compte la validation de données de la cellule A4
.Delete 'efface une éventuelle ancienne validation de données
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=Join(tt(), ",") 'utilise la liste des éléments du tableau tt comme validation de données
End With 'fin de la prise en compte de l'onglet "Tables"
.Range("B3").AutoFilter Field:=2 'affiche tout (supprime le critère)
End With 'fin de la prise en compte de l'onglet "Tables"
Range("A4").Select 'sélectionne la cellule A4
End Sub