Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme Macro Mémoire insuffisant, mais ca marche a la main!

4 réponses
Avatar
Charles
Bonjour,

j'ai un probleme. J'ai une macro qui génere une erreur lors de la copie
d'une formule dans une cellule. Il me dit Mémoire Insuffisante.

Voilà ce que fait la macro:
J'ai deux listes de valeurs, A et B, et je veux créer une formule qui associera
à une cellule une valeur de B en fonction de la valeur correspondante dans
la liste A d'un autre cellule.

Je m'explique :
A B
Vache=>meuh
Mouton=>Beeehh
Cheval=>Huuue

Et je veux créer une formule telle que dans un autre document,
si D1 vaut "Vache", alors E1 doit valoir "meuh", etc...

Sur ce forum, vous m'aviez conseillé une solution qui fonctione
parfaitement pour un petit nombre de valeurs possibles:

E1=INDEX({"meuh";"Beeh";"Huue"},EQUIV(D1,{"Vache";"Mouton";"Cheval"},0))

Mais en l'occurence, j'ai 120 valeurs et elles peuvent être amenées à être modifiées.
Mon idée est donc de créer une macro qui à partir des listes de valeurs A et B
va créer automatiquement la formule.

Voici la macro :


Sub Creer_formule()
pr_ligne = Range("B6")
dr_ligne = Range("B7")
pc_list = ""
mg_list = ""

For ligne = pr_ligne To dr_ligne
material_group = Cells(ligne, 1).Value
profit_center = Cells(ligne, 2).Value
If ligne <> dr_ligne Then
pc_list = pc_list & profit_center & ";"
mg_list = mg_list & material_group & ";"
Else
pc_list = pc_list & profit_center
mg_list = mg_list & material_group
End If
Next ligne

contenu = "=INDEX({" & pc_list & "},EQUIV(A11,{" & mg_list & "},0))"
Range("C11").Value = contenu

End Sub


Cette macro fonctionne presque parfaitement pour un nombre moyen de
valeurs (50 par exemple) mais pas pour 120. Il me dit "Mémoire insuffisante"
lors de la copie de contenu dans C11. Or, j'ai réussi à créer cette formule
à la main pour quasiment une centaine de valeurs, et qu'Excel accepte.

Auriez vous une solution?

Merci infiniment,
Charles


==================
Formule crée à la main :
=INDEX({
51010;51020;51021;51022;51024;51026;51080;51081;51060;51061;51062;51063;51064;51015;51065;51066;51040;51041;51042;51050;51051;51052;51053;51054;51055;51201;51202;51203;51204;51205;51206;51210;51220;51310;51320;51325;51330;51334;51340;51341;51342;51339;51345;51436;51437;51438;51439;51441;51442;51443;51444;51445;51440;51501;51502;51503;51504;51505;51506;51507;51508;51509;51510;51511;51513;51512;51514;51515;51516;51517;51518;51519;51520;51530;52100;52101;52102
},EQUIV(A11,{
51010;51020;51021;51022;51023;51024;51070;51071;51050;51051;51052;51053;51054;51055;51056;51057;51030;51031;51032;51040;51041;51042;51043;51044;51090;51210;51211;51212;51213;51214;51215;51220;51290;51310;51320;51321;51322;51323;51330;51331;51332;51360;51365;51380;51381;51382;51383;51384;51385;51386;51387;51388;51390;51410;51411;51412;51413;51414;51420;51421;51422;51423;51430;51431;51432;51440;51441;51450;51460;51461;51462;51470;51480;51490;51510;51511;51512
},0))

4 réponses

Avatar
Frédéric Sigonneau
Bonsoir,

Le recours à une macro ne me paraît pas inévitable... Tu peux aussi, AMA,
modifier la formule que tu utilises pour qu'elle traite des plages plutôt que
des listes "toutes faites".
Par exemple, en E1 :

=INDEX(B:B;EQUIV(D1;A:A;0))

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

j'ai un probleme. J'ai une macro qui génere une erreur lors de la copie
d'une formule dans une cellule. Il me dit Mémoire Insuffisante.

Voilà ce que fait la macro:
J'ai deux listes de valeurs, A et B, et je veux créer une formule qui associera
à une cellule une valeur de B en fonction de la valeur correspondante dans
la liste A d'un autre cellule.

Je m'explique :
A B
Vache=>meuh
Mouton=>Beeehh
Cheval=>Huuue

Et je veux créer une formule telle que dans un autre document,
si D1 vaut "Vache", alors E1 doit valoir "meuh", etc...

Sur ce forum, vous m'aviez conseillé une solution qui fonctione
parfaitement pour un petit nombre de valeurs possibles:

E1=INDEX({"meuh";"Beeh";"Huue"},EQUIV(D1,{"Vache";"Mouton";"Cheval"},0))

Mais en l'occurence, j'ai 120 valeurs et elles peuvent être amenées à être modifiées.
Mon idée est donc de créer une macro qui à partir des listes de valeurs A et B
va créer automatiquement la formule.

Voici la macro :

Sub Creer_formule()
pr_ligne = Range("B6")
dr_ligne = Range("B7")
pc_list = ""
mg_list = ""

For ligne = pr_ligne To dr_ligne
material_group = Cells(ligne, 1).Value
profit_center = Cells(ligne, 2).Value
If ligne <> dr_ligne Then
pc_list = pc_list & profit_center & ";"
mg_list = mg_list & material_group & ";"
Else
pc_list = pc_list & profit_center
mg_list = mg_list & material_group
End If
Next ligne

contenu = "=INDEX({" & pc_list & "},EQUIV(A11,{" & mg_list & "},0))"
Range("C11").Value = contenu

End Sub

Cette macro fonctionne presque parfaitement pour un nombre moyen de
valeurs (50 par exemple) mais pas pour 120. Il me dit "Mémoire insuffisante"
lors de la copie de contenu dans C11. Or, j'ai réussi à créer cette formule
à la main pour quasiment une centaine de valeurs, et qu'Excel accepte.

Auriez vous une solution?

Merci infiniment,
Charles

================= > Formule crée à la main :
=INDEX({
51010;51020;51021;51022;51024;51026;51080;51081;51060;51061;51062;51063;51064;51015;51065;51066;51040;51041;51042;51050;51051;51052;51053;51054;51055;51201;51202;51203;51204;51205;51206;51210;51220;51310;51320;51325;51330;51334;51340;51341;51342;51339;51345;51436;51437;51438;51439;51441;51442;51443;51444;51445;51440;51501;51502;51503;51504;51505;51506;51507;51508;51509;51510;51511;51513;51512;51514;51515;51516;51517;51518;51519;51520;51530;52100;52101;52102
},EQUIV(A11,{
51010;51020;51021;51022;51023;51024;51070;51071;51050;51051;51052;51053;51054;51055;51056;51057;51030;51031;51032;51040;51041;51042;51043;51044;51090;51210;51211;51212;51213;51214;51215;51220;51290;51310;51320;51321;51322;51323;51330;51331;51332;51360;51365;51380;51381;51382;51383;51384;51385;51386;51387;51388;51390;51410;51411;51412;51413;51414;51420;51421;51422;51423;51430;51431;51432;51440;51441;51450;51460;51461;51462;51470;51480;51490;51510;51511;51512
},0))


Avatar
D.LAIR
Et pourquoi ne pas mettre la formule RECHERCHEV ?
Avatar
AV
Et pourquoi ne pas mettre la formule RECHERCHEV ?


Ha ..que j'aime cette question. ! ;-)

AV

Avatar
Frédéric Sigonneau
Bonjour,

En effet, pourquoi pas ! Il y n'a que très rarement une seule solution à un
problème, et, dans ce cas, RechercheV peut en être une aussi.
Ça donne une formule plus courte, ici, mais moins souple. Avec la combinaison
INDEX/EQUIV tu peux inverser la recherche (chercher dans la colonne A en
fournissant une valeur de la colonne B) ce qui est impossible avec RECHERCHEV.
D'accord, ce n'était pas dans la question :-))

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Et pourquoi ne pas mettre la formule RECHERCHEV ?