Macro : répétition de formule

Résolu/Fermé
Sirithhyando Messages postés 49 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 octobre 2018 - 10 mars 2015 à 18:32
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 16 mars 2015 à 18:03
Bonjour,

J'ai une formule à tiré de A2 à A30000. La formule fonctionne, mais le fichier deviens trop lourd. Après avoir cherché, je crois que seule une macro pourrait m'aider.
Est-il possible par macro de faire ce calcul et mettre la valeur résultante de A2 à A30000?
(j'ai la même chose à faire pour E2 à E30000)

La formule en A2 est (en formule matricielle) :
SI(MAX(SI('2004-2014'!$B$2:$B$30000=B2;SI('2004-2014'!$C$2:$C$30000=C2;'2004-2014'!$A$2:$A$30000)))=0;MAX(SI('1997-2003'!$B$1:$B$25160=B2;SI('1997-2003'!$C$1:$C$25160=C2;'1997-2003'!$A$1:$A$25160)));MAX(SI('2004-2014'!$B$2:$B$30000=B2;SI('2004-2014'!$C$2:$C$30000=C2;'2004-2014'!$A$2:$A$30000))))

La formule en E2 est (en formule matricielle) :
INDEX('2004-2014'!G:G;EQUIV('Nationale actualisé'!A2&'Nationale actualisé'!B2&'Nationale actualisé'!C2;'2004-2014'!A:A&'2004-2014'!B:B&'2004-2014'!C:C;0);1)

Merci d'avance
Ça m'enlèverais toute une épine du pied, ça fais plusieurs jours que je cherche une solution sur le web.



A voir également:

3 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
10 mars 2015 à 22:24
Bonjour,

Tu peux le faire sans macro, tu sélectionnes ta plage, copier et collage spécial valeurs.
Il te suffit de garder ta formule en première ou dernière ligne selon le fonctionnement de ton classeur.
0
Sirithhyando Messages postés 49 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 octobre 2018 1
11 mars 2015 à 12:41
Salut,
Merci de ta réponse, mais ce n'est pas ce que je cherchais.
B2 et C2 peut être égal à B17 et C17. Dans ce cas, c'est A2 et A17 qui seraient différend. Ma formule me donne la valeure maximale en A pour B2 et C2 puis B3 et C3 puis B4 et C4 et ainsi de suite.
C'est ce que trouve ma formule matricielle. Sauf que comme dis plus haut, tiré cette formule sur 30000 lignes rend le fichier trop lourd. Ce pourquoi j'essai de passer par une macro.
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
11 mars 2015 à 18:17
bonsoir,

Est-il possible par macro de faire ce calcul et mettre la valeur résultante de A2 à A30000?
Si par macro tu mets ta "valeur résultante" le calcul ne se fera pas, d'où ma solution.

Ce que tu voudrais c'est une fonction macro personnelle qui fasse la même chose.
Si tu pouvais nous mettre un exemple de structure des données, sans éléments personnels, avec une centaine de lignes, se serait plus facile de t'aider.
Pour communiquer ton classeur tu le télécharges sur https://www.cjoint.com/ et tu mets ici le lien obtenu.
0
Sirithhyando Messages postés 49 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 octobre 2018 1
12 mars 2015 à 13:23
https://www.cjoint.com/?3CmnEsUAWGs
Salut,
désolé il semblerait que j'ai été mal compris. Je ne veux pas mettre la valeur du max de A1 partout, la valeur max en A1 va être différente d'un à l'autre.
La base de donné représente des données prises à un endroit à une année précise. On reprend la donnée au même endroit à une année subséquente.
Ce que j'essai d'avoir est la dernière année qu'une valeure a été prise pour un endroit précis.
Donc je cherche à avoir en A2, l'année pour l'endroit écrit en B2 et C2.
Prend les colonnes B et C comme étant des coordonnées. C'est juste que la colonne B contient du texte.
Merci
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
12 mars 2015 à 22:44
Bonjour,

Pas de souci, j'avais effectivement mal interprété la première demande.

Je t'ai donc fait 2 fonctions personnalisées qui donnent le même résultat que tes matricielles :

https://www.cjoint.com/c/ECmwXHmCTOJ

Pour ta matricielle index, je t'ai rajouté une colonne en jaune qui est matricielle aussi mais avec des plages nommées dynamiques : le temps d'exécution est très nettement amélioré avec cette méthode, au lieu de prendre la colonne entière.
0
Sirithhyando Messages postés 49 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 octobre 2018 1
13 mars 2015 à 20:27
Merci bien,
La première option avec les matricielles et de donner un nom à la plage de données qui se modifie si la base de donnée est modifié est excellente. Sauf que au lieu d'une plage de données de 30000 lignes pour m'assurer de tout contenir la BD, j'ai une plage de 26699 lignes. La formule comme tel est plus rapide (6 minutes au lieu d'abandonner vu un temps extrême donc je n'ai jamais su combien de temps pour l'ancienne).
Pour la deuxième option, je n'ai pas réussi à l'appliquer à mon fichier. J'ai copié la macro dans mon fichier et inséré les nouvelles formules (je ne savais pas qu'on pouvais créé des formules à l'aide du vba), mais j'obtiens l'erreur : #NOM?.
Je me suis rendu compte que dans ton fichier, quand je tape la formule, la formule créé dans la macro apparait, mais pas quand je le fais dans mon fichier. Je suppose que je dois démarer la macro qui créé la formule avant, mais je n'arrive pas à trouver comment.

Merci pour ton aide :)
Et surtout j'ai appris beaucoup sur les fonctions d'excel et comment mieux travailler avec en suivant l'exemple que tu m'a envoyé, ça ne m'aurais pas passé par la tête de nommer mes plages de données et encore moins d'avoir une plage nommé avec une formule pour la déterminé.
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
13 mars 2015 à 22:26
Bonjour et merci pour ton sympathique message bien agréable !

J'ai copié la macro dans mon fichier
Sans doute pas de façon correcte d'où ton erreur, sûrement due à l'absence des déclarations de variable en-tête (
Public...
) qui sont essentielles pour le fonctionnement.

Comme tu as intégré beaucoup de choses sur mon exemple, pour copier la macro, tu ouvres les 2 fichiers dans la même session, et dans l'éditeur VBA tu vas trouver dans mon fichier un module "Fonctions".
Tu le sélectionnes sans lâcher le bouton et tu l'emmènes dans ton classeur : si tu as activé les macro, les fonctions devraient être opérationnelles.
Normalement le temps devrait être assez rapide mais je n'ai pas testé sur des plages de 26699 lignes : espérons que l'on fasse moins de 6 minutes mais je ne sais pas combien tu mets de formules dans "actualisé". Tu peux aussi utiliser les formules nommées avec les macros, cela réduira aussi le temps.
0
Sirithhyando Messages postés 49 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 octobre 2018 1
16 mars 2015 à 14:06
Salut,
Au départ, j'avais fais ctrl+A pour tout prendre ta matrice avant de la copier alors j'avais bien emmené la déclaration de variable "Public".
Et voilà, en déplaçant le module "Fonctions", ça a bien fonctionné.
Pour le nombre de formules, c'est la base de données qui fait 26699, donc chaque formules cherches sur toute la BD. Dans "actualisé", j'ai un total de 10117 formules qui avant ton aide étaient de 2 à 3 fois plus longues.
Et maintenant on est passé de 6 minutes à 3 minutes. C'est long, mais beaucoup plus raisonable qu'avant ton aide.
Donc merci beaucoup :)
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
16 mars 2015 à 18:03
Merci du retour.
eh oui, excel a bien multiplié le nombre de lignes car 65000 c'était trop petit parait-il mais lorsque l'on remplit les lignes le temps de calcul, même avec de bons processeurs, n'est pas négligeable.
Content tout de même que ma méthode te raccourcisse la durée.
Bien cordialement.
0