-
Nom de plage dynamique
Bonjour à tous,
Je me casse les dents sur un problème depuis ce matin, je vais essayer de l'énoncer de manière aussi claire que possible.
J'ai, dans mon classeur, une feuille "Listes" contenant des... listes. Par exemple, la plage B2:B7 est nommée Tous_les_jours et est utilisée dans une liste déroulante dans une autre feuille.
Dans cette autre feuille, appelons-la "Banane", le texte "Tous les jours" apparaît dans la cellule A5. La cellule B5 est conditionnée par ce texte, puisqu'elle permet le choix de valeurs parmi la liste Tous_les_jours, créée dans Validation des Données de B5, j'ai la formule =INDIRECT(SUBSTITUE(A5;" ";"_"))
Et cela fonctionne très bien :)
Maintenant, j'essaie de mettre en Banane!C5 une valeur dépendant de Banane!B5, et se trouvant dans Listes.
Par exemple, si je choisis dans la liste déroulante de Banane!B5, le contenu se trouvant en Listes!B2, je souhaiterais obtenir la valeur de Listes!C2 dans Banane!C5.
Je comptais utiliser la fonction Match, avec un truc du genre
Code:
Match(Sheets("Banane").Range("B5"), Replace(Range("A5").Text, " ", "_"), 0)
dans la macro Worksheet_Change dont je me sers déjà.
Mais cela ne marche pas, car le Replace me renvoie un type String, qui devrait être interprété comme le nom d'une plage, mais qui ne l'est pas...
Je suis conscient que mon problème est difficile à expliquer, malheureusement je ne peux pas déposer mon tableur, puisque celui-ci contient des données confidentielles.
Je remercie les gens qui auront pris le temps de me lire :)
Cordialement,
Mikro93.
-
Pas bien sur de ce que tu veux mais tu peux faire une recherche dans une plage nommée avec la fonction 'Match()':
Code:
Application.WorksheetFunction.Match(Range("A1").Value, Range("Plage_Nommée"), 0)
-
Bonjour vcottineau, et merci pour cette réponse rapide,
C'est exactement ce que je voudrais faire, sauf qu'à la place de
Code:
Range("plage_nommée")
j'ai essayé avec
Code:
Range(Replace(Range("A5").Text, " ", "_")))
et j'obtiens une erreur 1004. Mon code exact est :
Code:
Range("E5").Value = Application.WorksheetFunction.Match(Range("B5").Value, Range(Replace(Range("A5").Text, " ", "_")), 0)
Cordialement,
Mikro93.
-
-
Dans ce cas il vaut mieux raisonner à l'envers:
Code:
Range("E5").Value = Application.WorksheetFunction.Match(Replace(Range("B5").Value, "_", " "), Range("A5"), 0)
-
@EngueEngue : je ne suis pas sûr de voir duquel il s'agit, j'essaie de les enlever un par un, j'obtiens divers messages d'erreur.
@vcottineau :
Je n'ai pas dû exprimer mon problème de façon assez claire :)
Dans ma cellule A5 se trouve le texte Tous les jours , et ma cellule B5 contient un choix parmi ceux de la liste appelée Tous_les_jours. Je dois donc bien faire un
Code:
Replace(Range("A5").Value, " ", "_")
Et en inversant simplement :
Code:
Range("E5").Value = Application.WorksheetFunction.Match(Range(Replace(Range("A5").Value, " ", "_"), Range("B5").Value), 0)
j'obtiens le même message 1004.
EDIT : un code plus approprié serait (erreur de parenthèse) :
Code:
Range("E5").Value = Application.WorksheetFunction.Match(Range(Replace(Range("A5").Value, " ", "_")), Range("B5").Value, 0)
Mais toujours la même erreur.
-
Et comme ça:
Code:
Range("E5").Value = Application.WorksheetFunction.Match(Range("B5").Value, Range(Replace(Range("A5").Value, " ", "_")), 0)
-
@ vcottineau : Et non, malheureusement, toujours la même erreur...
-
Vérifie que:
Code:
Replace(Range("A5").Value, " ", "_")
est bien identique au nom de ta plage nommée et que:
Existe bien dans la plage correspondante.
Sinon j'ai mal compris ton problème parce que ça devrait marcher.
-
Bonjour,
Les valeurs correspondent et existent bien.
Mais j'ai trouvé la solution ! Le problème résidait dans le fait que plusieurs feuilles sont impliquées, il fallait donc écrire :
Code:
ActiveSheet.Range("E5").Value = Application.WorksheetFunction.Match(ActiveSheet.Range("B5").Value, Sheets("Listes").Range(Replace(ActiveSheet.Range("A5").Value, " ", "_")), 0)
Plus qu'un léger problème de boucle infinie à résoudre dans une boucle For...
Merci en tout cas de m'avoir aiguillé dans la bonne direction, au moins par élimination ;)
Cordialement,
Mikro93.