Re : Explications sur les formules
Salut UJAP et le forum
Bonne démarche de vouloir comprendre ce qu'on fait. Mais un tuto répond à un besoin précis qui n'est pas forcément le tien.
La feuille mélange macro et formule
Macro :
Private Sub Worksheet_Change(ByVal Target As Range) : Macro à lancement automatique qui se déclenche quand tu sorts de la cellule. Target variable déclarée en plage de cellules et que le système met à jour systèmatiquement avec la/les cellule(s) venant d'être modifiée(s)
If Target.Column = 1 And Target.Count = 1 Then : test limitant le traitement de target à la colonne 1, ET(and : fonction ET logique) si elle ne contient qu'une seule cellules (compter (count) les cellules (cells : par défaut) de target).
If...Then...endif : fonction si 2ème syntaxe :
- si la condition est Vrai/True (au sens logique), on exécute les lignes de code suivantes jusqu'à rencontrer le délimiteur pour le traitement de la partie fausse (Else : qui est omit ici)
- si la condition est Faux/False, on saute directement à la partie Else, ou, si comme ici elle n'existe pas, à Endif qui délimite la fin du test.
If Target <> "" Then : second test : on teste que la cellule modifiée contienne quelque chose. L'indentation (Les retraits dans la macro) permet de de se repérer dans les tests, boucles, etc.
On Error Resume Next : Si Excel décéle une erreur, continuer => Mon opinion : c'est un moyen de "botter en touche". S'il y a une erreur, ne pas en tenir compte. Après, on ne comprend plus ce qui arrive ! À n'utiliser que si on n'a réellement pas d'autres moyens de corriger l'erreur, et remettre la gestion des erreurs en route dès que possible.
Set temp = [noms].Find(Target.Value, LookAt:=xlWhole) : fixer (set) la variable temp (non déclarée, mais le set indique qu'excel doit s'occuper du contenant (ici range/cellule) = rechercher (Find) dans la plage nommée noms ([A1]<=>Range("A1") même résultat, mais écriture différente) la cellule contenant la valeur de Target, cellule complète (xlWhole)
If Err = 50290 Then Exit Sub : si Excel a détecter une erreur de numéro 50290 alors sortir de la macro (if....then : première syntaxe)
If temp Is Nothing Then Application.Undo si Temp est rien alors excel doit annuler la dernière opération. Le Set...Find a fixé Temp à la valeur de la cellule qu'il a trouvé. S'il ne l'a pas trouvé, temp n'existe pas : revient à traiter la partie infructueuse de Find
End If fin du test 2
End If fin du test 1
End Sub fin de la macro
Formule :
Noms : =DECALER(Feuil1!$D$2;;;NBVAL(Feuil1!$D:$D)-1)
revient à écrire =DECALER(Feuil1!$D$2;0;0;NBVAL(Feuil1!$D:$D)-1;1)
Decaler() : fait référence à une plage
Feuil1!$D$2 : à partir de la cellule D2 => Noms = D2
;0;0 : décaler D2 de 0 ligne 0 colonne => Noms = D2
NBVAL(Feuil1!$D:$D)-1 : nombre de valeur dans la colonne D, auquel on retire 1 : ici renvoie 9- le titre = 8 : nombre de lignes
;1) : nombre de colonnes
Noms : plage de cellules commençant en D2 faisant 8 lignes et une colonne
Manière de déclarer de manière dynamique une plage nommée => tout ajout ou suppression en colonne D modifiera l'adresse de la plage nom.
Liste de validation de A2 : =DECALER(Noms;EQUIV(A2&"*";Noms;0)-1;;NB.SI(Noms;A2&"*"))
Même genre sauf qu'on décale de Equiv() lignes
et que le nombre de lignes = nombre de noms commençant comme la cellule A2
Equiv() renvoie le numéro de la ligne dans Noms où se trouve la cellule qui commence par la valeur en A2
Quand tu demandes de t'expliquer une formule, donne au moins une idée de ton niveau.
Si tu utilises une telle méthode, il faut que ta colonne contenant les nom ne contienne que ceux-ci, et qu'il soit trié en ordre alphabétique croissant.
A+