Utilisation d'une plage nommée dans FormulaLocal
Bonjour à toutes et à tous,
Avant toute chose, bonne année à vous car il encore temps de la souhaiter
Je suis en train de devenir totalement chèvre sur un problème de syntaxe. Explication :
Je cherche à utiliser un INDEX + EQUIV imbriqué. Jusque là, tout va bien.
Mon soucis est de réussir à appliquer la fonction EQUIV sur une plage NOMMÉE !
Je détermine ma plage comme ceci :
Dim plg_index As Range
If anneeacreer = 2018 Then
plg_index = Range("E5:E15")
ElseIf anneeacreer = 2019 Then
Set plg_index = Sheets("Notice").Range("F5:F15")
ElseIf anneeacreer = 2020 Then
plg_index = Range("G5:G15")
ElseIf anneeacreer = 2021 Then
plg_index = Range("F5:F15")
End If
La variable "anneeacreer" est déterminée plus haut dans ma macro, et fonctionne correctement.
J'ai fais le test avec Msgbox(plg_index.Address) : si "anneeacreer" est 2019, la plage retenue est bien "$F$5:$F$15".
Le problème survient ensuite... Comment faire pour utiliser le nom "plg_index" dans une formule ?
Ma formule récupère une date sur la feuille en cours de traitement et la recherche dans la feuille "Notice". Voilà ce que j'avais tenté d'écrire mais qui bien sûr ne fonctionne pas :
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);plg_index.Address;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);plg_index.address;0);1);"""")"
J'ai tenté avec toutes les syntaxes qui me venaient en tête mais là vraiment je ne trouve pas la soluce !
J'en appelle donc à vos talents et vos connaissances !
Merci d'avance pour votre temps !
Bonjour,
Merci de joindre un fichier à ta demande.
Cdlt.
Bonjour Jean-Eric,
Vous trouverez mon fichier ci-dessous.
J'ai recréer un classeur simplifié car le fichier de base est gros et la macro assez longue.
Normalement, ce fichier simplifié devrait suffire à comprendre mon problème je pense ?
Dites-moi si ce n'est pas le cas.
Merci
EDIT :
Si cela peut vous aider, voilà comment je traite le problème pour l'instant :
If anneeacreer = 2018 Then
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$E5:$E15;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$E5:$E15;0);1);"""")"
ElseIf anneeacreer = 2019 Then
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$F5:$F15;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$F5:$F15;0);1);"""")"
ElseIf anneeacreer = 2020 Then
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$G5:$G15;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$G5:$G15;0);1);"""")"
ElseIf anneeacreer = 2021 Then
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$E5:$E15;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);Notice!$H5:$H15;0);1);"""")"
End If
Bonjour,
pourquoi vouloir remplacer le nom par sa référence avec plg_index.Address ?
Utiliser le nom plg_index tout seul.
D'ailleurs il n'y a aucun de défini dans ton classeur... alors ???
eric
PS : avec plg_index = Range("E5:E15")
tu définis une variable range, pas un nom.
Et comme c'est un objet ça doit être Set plg_index = Range("E5:E15")
Le compilateur a dû t'insulter à ce sujet, il faut lire les messages
Et à moins d'être sûr à 120% de la feuille active il faut la spécifier dans la définition :
plg_index = Sheets("ma_feuille").Range("E5:E15")
PS2 : plutôt que x ElseIf selon l'année, décale ton range d'autant de colonne que annéeàcréer-2018 avec range(xx:yy).Offset(annéeàcréer-2018) partout où c'est nécessaire.
Ca ne te fera plus qu'une ligne pour cette partie sera valable dans 50 ans
Bonjour eriiic,
J'ai ajouté le .Address après avoir essayé sans.. et après que ça n'ait pas marché ahah
Mais du coup effectivement ça doit venir du fait qu'aucun nom n'est défini..
Cependant je ne comprends pas à quoi sert d'écrire
Set plg_index = Sheets("Notice").Range("F5:F15")
si cela ne défini pas un nom ?
Excusez-moi si ma question est idiote, je suis encore novice en VBA
EDIT :
Oui pardon, j'avais essayé juste sur 2019 et j'avais oublié de rajouter le Set de partout
Bonjour,
PS2 : plutôt que x ElseIf selon l'année, décale ton range d'autant de colonne que annéeàcréer-2018 avec range(xx:yy).Offset(annéeàcréer-2018) partout où c'est nécessaire.
Ca ne te fera plus qu'une ligne pour cette partie sera valable dans 50 ans
Effectivement, je viens d'adapter mon code, c'est beaucoup mieux à voir ahah
Dim plg_index As Range
Set plg_index = Sheets("Notice").Range("E5:E15").Offset(0, anneeacreer - 2019)
(J'ai utiliser anneeacreer - 2019 car j'ai supprimé 2018 de mon tableau, je travaille désormais de 2019 à 2022).
J'ai également réfléchi à ce que tu disais sur le fait qu'aucun nom n'était défini et suis donc passé par ceci :
Names.Add Name:="plg_index", RefersTo:="=Notice!" & plg_index.Address
ActiveCell.FormulaLocal = "=SI(NON(ESTERREUR(INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);plg_index;0);1)));INDEX(Notice!D5:H15;EQUIV(DATE(ANNEE(B4);MOIS(B4);1);plg_index;0);1);"""")"
J'ai l'impression que ça fonctionne, je continue de tester pour l'instant.. Pensez-vous que cette méthode est la bonne ?
Faut-il bien passer par le plg_index.Address ?