1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
Private Sub Worksheet_Change(ByVal Target As Range)
'Worksheet_Change permet d'intercepter toute modification manuelle ou
'macro dans la feuille (mais pas les modifs via formules, d'après ce que j'ai remarqué).
' Redéfinition de la plage de la liste déroulante quand on ajoute ou supprime une entrée
Dim var_active, var_range, var_refers, libelle_liste As String
On Error GoTo fin
'la macro détecte toute modification dans la feuille, mais on ne veut la
'déclencher que si la modif est sur le colonne Z (qui a le n° 26, sauf erreur de ma part :mrgreen:)
If Target.Column = 26 Then '=> donc seule colonne Z remplit la condition
'on garde en mémoire la cellule actuellement active, pour la re-sélectionner à la fin :
var_active = ActiveCell.Address
'on va identifier la dernière cellule remplie de la colonne Z, son n° de ligne
'sera mis dans la variable i :
i = 1 'on commence la boucle de vérification à la ligne 1...
Do While Cells(i, Target.Column) <> "" '...et tant qu'on ne rencontre pas de cellule vide...
i = i + 1 '...on continue...
Loop
i = i - 1 'à la fin i a été itéré une fois de trop, on rectifie
'on définit les variables dont on aura besoin pour définir la plage de la liste, en fonction de i :
var_range = "A7:A" & i
var_refers = "=Paramètres!R7C1:R" & i & "C1"
libelle_liste = "liste_admins" 'ici c'est le nom de ta liste, à modifier !
'on sélectionne la plage de cellules qu'on va utiliser : colonne Z, de la ligne 1 à la ligne i :
Range(var_range).Select
'on crée et "nomme" la référence à cette plage de cellules.
'elle existait déjà bien sûr, mais on la redéfinit :
ActiveWorkbook.Names.Add Name:=libelle_liste, RefersToR1C1:=var_refers
'on re-sélectionne la cellule qui était active au début, pour que l'utilisateur ne se rende compte de rien (ou de pas grand-chose en tout cas) ;) :
Range(var_active).Select
End If
fin:
End Sub |
Partager