Macro Rechercher et Remplacer, avec valeurs variables
Bonjour,
Je suis enseignante en LV1 et je suis en train de créer un fichier excel dans lequel les niveaux européens que nous utilisons pour évaluer les élèves (A1, A2, etc) sont automatiquement transformés en note chiffrée.
J'essaie de créer une macro qui me permettra de rechercher les niveaux (A1, A2, etc) pour les remplacer par une note. Normalement j'aurais fait ça avec une formule. Sauf que la valeur de remplacement va varier en fonction de la classe de l'élève. Un 6e qui a A1 aura une très bonne note alors que l'élève qui a A1 en 3e ne peut pas avoir une bonne note il est sensé avoir progressé depuis. Vu le nombre de paramètres, les formules devenaient bien trop longues et je pense qu'une macro par classe fera beaucoup mieux l'affaire.
Avec l'enregistrement de macro j'y suis très bien parvenue :
Cells.Replace What:="A1", Replacement:="1", LookAt:=xlWhole, SearchOrder _
:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False, _
FormulaVersion:=xlReplaceFormula2Je répèterai ce code en modifiant les valeurs What et Replacement, et je créerai une macro par classe.
Ma question est : est-il possible que la valeur de remplacement ne soit pas fixe mais renvoie à une cellule du classeur (et puisse donc évoluer en fonction du contenu de cette cellule) ? >> si je décide que A1 = 2 au lieu de 1 par exemple à l'avenir
Merci d'avance de votre réponse
Je suis autodidacte dans l'utilisation de Excel, je comprends beaucoup de choses mais j'en ignore un million de fois plus...
J'utilise Microsoft 365 pour entreprise.
Bonjour,
Supposons que vous ayez un tableau structuré nommé "Liste" avec 2 colonnes (au moins) "Niveau" et "Note" :
Alors, voici un code à essayer qui boucle sur chaque cellule de ce tableau :
Sub rmplt()
for i = 1 to range("Liste").rows.count
if range("Liste[Niveau]")(i).value <> "" and range("Liste[Note]")(i).value <> "" then
niveau = range("Liste[Niveau]")(i).value
note = range("Liste[Note]")(i).value
with sheets("nomfeuilleciblée") '<<<<< ADAPTER NOM DE LA FEUILLE SUBISSANT LES REMPLACMENTS
.Cells.Replace What:=niveau, Replacement:=note, LookAt:=xlWhole, SearchOrder _
:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False, _
FormulaVersion:=xlReplaceFormula2
end with
end if
next i
end subIl faudra donc créer ce tableau et modifier le nom de la feuille dans le code.
Cdlt,
EDIT de ma réponse qui était un non sens... Je pense avoir à peu près compris mais je voudrais être certaine que le reste de mon classeur correspondra à ce qui est proposé :
| Paliers de niveaux visés | Classe et période de l’année concernées | Pré-A1 | A1 | A1+ | A2- | A2 | A2+ | B1- | B1 |
| B1 palier 2 | 3e 2e partie | 0 | 1 | 2 | 3 | 5 | 6 | 8 | 10 |
| B1 palier 1 | 3e 1e partie 4e 2e partie | 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 |
| B1- | 4e 1e partie | 2 | 3 | 4 | 5 | 7 | 9 | 10 | 10 |
| A2+ | 5e 2e partie | 3 | 4 | 5 | 6 | 8 | 10 | 10 | 10 |
| A2 | 5e 1e partie 6e 2e partie | 3 | 5 | 7 | 8 | 10 | 10 | 10 | 10 |
| A2- | 6e 1e partie | 4 | 6 | 8 | 10 | 10 | 10 | 10 | 10 |
Ci dessus le tableau que j'utilise et dans lequel j'aimerais pouvoir modifier mes valeurs au besoin.
Dans une autre feuille de classeur, j'ai une liste déroulante présentant la première colonne (paliers de niveaux visés) et qui doit être préalablement sélectionnée pour compléter le reste de la grille de notes.
L'idée serait de dire SI dans ma liste déroulante le niveau A2 (par exemple) est sélectionné, alors je veux que les valeurs dans mes entêtes (Pré-A1, A1, etc...) soient remplacées par les nombres dans la ligne correspondant à A2 (3,5, etc). Mais du coup si au lieu de A2 je sélectionne B1 palier 2 par exemple, il remplace bien Pré-A1 par 0, A1 par 1, etc.
J'espère que c'est plus clair...
Et encore merci de votre aide !
Non, désolé, ce n'est pas plus clair
En fait, il était question de variabiliser la valeur à remplacer et la valeur de remplacement...
Sans fichier, étant donné que les valeurs de remplacement dépendent de plusieurs critères (si j'ai bien compris), je ne pourrais pas savoir quoi faire.
Cdlt,
Edit : Pouvez-vous joindre un fichier représentatif ?
Alors voici mon fichier :
En le parcourant pour expliquer son utilisation, j'ai même trouvé plus simple, mais je ne sais pas plus comment m'y prendre.
Voici comment cela fonctionne : les données que je veux pouvoir modifier sont dans le tableau de la feuille "données".
Dans la feuille "Grille Prof" je remplis le niveau des élèves dans leurs évaluations (ici en jaune pour l'exemple).
Dans la cellule T2 je sélectionne quel niveau est visé. La suite de la cette même ligne (de V à AC) affiche automatiquement les valeurs que je voudrais voir remplacer le contenu en jaune. (c'est grâce à cela qu'il ne sera pas nécessaire de faire référence à mon tableau puisque cela a pour effet d'extraire les données que je veux pour le remplacement)
La feuille "remplacement" est prévue pour que j'y fasse les manipulation de remplacement. Je copie les valeurs en jaunes, je les colle dans la feuille de remplacement (déjà fait dans mon doc d'exemple), j'appuie sur le bouton "remplacement" qui déclenchera la macro sur laquelle nous travaillons, puis sur le bouton "report automatique des notes", ce qui a pour effet de copier les notes calculées automatiquement de la colonne S de remplacement vers la colonne "notes" dans la grille Prof.
Il est important que la grille prof soit remplie car c'est la base de mon futur publipostage pour que les élèves reçoivent leurs grilles personnalisées. Et il ne faut pas que les données en jaune soient remplacées dans la grille prof car je veux qu'elle apparaissent telles quelles dans mon futur publipostage. Le remplacement ne sert en réalité qu'à calculer la note finale qui découle des niveaux validés pour les élèves.
Bon j'espère que c'est plus clair Oo J'ai bien conscience que ce n'est pas simple, mais c'est bien pour cela que j'ai besoin de votre aide ! ;)
Et encore merci d'avance !
Re,
C'est pas encore tout à fait limpide mais je crois avoir compris. Alors, j'aurais plutôt une proposition de formule à faire, un INDEX double EQUIV.
Désolé, je sais que ça ne va pas vraiment dans le sens de votre apprentissage de VBA mais ça me parait une bonne solution compte tenu ce problème de publipostage.
Dites-moi si les résultats vous semblent bons.
Cdlt,
Cela fonctionne parfaitement, merci beaucoup !
Entre temps j'ai eu l'illumination et j'avais réussi à produire le même résultats avec une autre formule mais BEAUUCOUP plus pénible que la vôtre, je vais donc étudier la vôtre que je ne comprends pas, là, comme ça, afin de pouvoir m'en resservir un jour si besoin...
=SI.CONDITIONS(GrilleProf!D2="Pré-A1";GrilleProf!$X$2;GrilleProf!D2="A1";GrilleProf!$Y$2;GrilleProf!D2="A1+";GrilleProf!$Z$2;GrilleProf!D2="A2-";GrilleProf!$AA$2;GrilleProf!D2="A2";GrilleProf!$AB$2;GrilleProf!D2="A2+";GrilleProf!$AC$2;GrilleProf!D2="B1-";GrilleProf!$AD$2;GrilleProf!D2="B1";GrilleProf!$AE$2;GrilleProf!D2=Données!$L$1;Données!$L$2;GrilleProf!D2=Données!$M$1;Données!$M$2;GrilleProf!D2=Données!$N$1;Données!$N$2;GrilleProf!D2=Données!$O$1;Données!$O$2;GrilleProf!D2=Données!$P$1;Données!$P$2;GrilleProf!D2=Données!$Q$1;Données!$Q$2)
Encore merci de votre aide, je reviendrai peut-être pour demander des éclaircissements sur la formule, mais je vais prendre le temps de décortiquer tout cela avant je pense avoir saisi le principe
Je vais l'expliquer maintenant, sachant que maitriser INDEX EQUIV est très utile/important sur excel (c'est un peu comme la fonction SOMMEPROD).
EQUIV(valeur;VECTEUR;0) renvoie la position de correspondance de valeur dans VECTEUR.
Donc EQUIV(4;{6;4;3;2;1};0) renvoie 2 (4 est bien à la 2è place).
INDEX(TABLEAU;LIGNE;COLONNE) renvoie la valeur qui se trouve à la cellule du TABLEAU à l'intersection de la ligne LIGNE et de la colonne COLONNE.
Dans ce tableau :
| 1 | 2 | 3 |
| 9 | 8 | 7 |
INDEX(TABLEAU;2;2) renvoie 8 (qui est bien à la 2è ligne et 2è colonne).
La combinaison INDEX(TABLEAU;EQUIV(v1;VECTEURCOL;0);EQUIV(v2;VECTEURLIG;0))
permet de rechercher sur 2 critères, v1 et v2. On recherche v1 dans la colonne VECTEURCOL. On obtient la position de ligne.
On recherche v2 dans VECTEURLIG, on obtient la position de colonne. On renvoie la valeur correspondante dans le TABLEAU.
Cdlt,
Merci beaucoup j'ai compris.
Par contre va falloir que j'étudie ce qu'est SOMMEPROD du coup pour bien faire
Bonjour,
Oui, je vous le conseille vivement ! C'est la porte d'accès au calcul matriciel. Voici un petit fichier qui vous permettra d'imaginer les possibilités.
Cdlt,