OVH Cloud OVH Cloud

Ecrire Forumle Excel en Macro

11 réponses
Avatar
Vader
Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une base de
données ... ça représente un tableau de 3500 lignes et 27 colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine

10 réponses

1 2
Avatar
JohnFuss
Bonjour,

réponse dans ton post ci-dessous :


"Vader" a écrit dans le message de
news:
Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une base de
données ... ça représente un tableau de 3500 lignes et 27 colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !


Oui mais on a vu pire

2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).


La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?


Oui

Est-ce plus léger ?


En taille c'est possible

Est-ce plus rapide ?


Non ça c'est sûr, les formules sont quasiment toujours plus rapide que le
VBA.


Merci d'avance,

Antoine



Je vois que tu concatene certaine infos, ne peux-tu pas le faire sur une
colonne et ensuite lancer ton recherchev() sur cette colonne concatenée
(voire même faire un collage spéciale par valeur pour limiter le temps de
recherche).

En gros à ta place je décomposerai ta formule en plusieurs formules sur
plusieurs colonnes.

Si tu as des soucis ou que ça ne convient je pourrai te donner des 'billes'
pour construire ta macro.

En espérant t'avoir apporté un peu

John

Avatar
Vader
Merci John,

Je me doutais bien que la macro serait plus lente ... :-(

J'ai finalement trouver le "truc" je copie/colle les forumles colonne par
colonne, ainsi je ne sature pas la RAM (512 mo et c'est pas assez !)

Sinon, je ne peux simplifer ou décomposer la forumle car toute cette
recherche est automatisée de la création des rubriques (variables de la
recherche) à la recherche des valeurs proprement dites. Il faut dire que je
remet à jour le tableur 2/3 fois par jours et le collage spécial est
franchement pas pratique dans ce cas.

Peux-tu me dire où trouver les équivalences forumles Excel et applicatifs
macro, site ou bouquin. Car à l'heure actuelle le bouquin que j'ai ne traite
pas de ce sujet ...


Bonjour,

réponse dans ton post ci-dessous :


"Vader" a écrit dans le message de
news:
Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une base de
données ... ça représente un tableau de 3500 lignes et 27 colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !


Oui mais on a vu pire

2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).


La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?


Oui

Est-ce plus léger ?


En taille c'est possible

Est-ce plus rapide ?


Non ça c'est sûr, les formules sont quasiment toujours plus rapide que le
VBA.


Merci d'avance,

Antoine



Je vois que tu concatene certaine infos, ne peux-tu pas le faire sur une
colonne et ensuite lancer ton recherchev() sur cette colonne concatenée
(voire même faire un collage spéciale par valeur pour limiter le temps de
recherche).

En gros à ta place je décomposerai ta formule en plusieurs formules sur
plusieurs colonnes.

Si tu as des soucis ou que ça ne convient je pourrai te donner des 'billes'
pour construire ta macro.

En espérant t'avoir apporté un peu

John






Avatar
Patrick BASTARD
Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard
Merci John,

Je me doutais bien que la macro serait plus lente ... :-(

J'ai finalement trouver le "truc" je copie/colle les forumles colonne
par colonne, ainsi je ne sature pas la RAM (512 mo et c'est pas assez
!)

Sinon, je ne peux simplifer ou décomposer la forumle car toute cette
recherche est automatisée de la création des rubriques (variables de
la recherche) à la recherche des valeurs proprement dites. Il faut
dire que je remet à jour le tableur 2/3 fois par jours et le collage
spécial est franchement pas pratique dans ce cas.

Peux-tu me dire où trouver les équivalences forumles Excel et
applicatifs macro, site ou bouquin. Car à l'heure actuelle le bouquin
que j'ai ne traite pas de ce sujet ...


Bonjour,

réponse dans ton post ci-dessous :


"Vader" a écrit dans le message de
news:
Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !


Oui mais on a vu pire

2) Excel plante quant je fais la copie de la forumle suivante sur
les 3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
-
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1
en colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de
calcul ?


Oui

Est-ce plus léger ?


En taille c'est possible

Est-ce plus rapide ?


Non ça c'est sûr, les formules sont quasiment toujours plus rapide
que le VBA.


Merci d'avance,

Antoine



Je vois que tu concatene certaine infos, ne peux-tu pas le faire sur
une colonne et ensuite lancer ton recherchev() sur cette colonne
concatenée (voire même faire un collage spéciale par valeur pour
limiter le temps de recherche).

En gros à ta place je décomposerai ta formule en plusieurs formules
sur plusieurs colonnes.

Si tu as des soucis ou que ça ne convient je pourrai te donner des
'billes' pour construire ta macro.

En espérant t'avoir apporté un peu

John





Avatar
Patrick BASTARD
Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
-
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine


Avatar
Vader
Merci Patrick,

Je le crois pas comment j'ai pu oublier une fonction aussi utile d'Excel ...

Tu es mon sauveur !

Antoine


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
-
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine







Avatar
Vader
Marche pas ... excel refuse de prendre une forumle en référence


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
-
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine







Avatar
JohnFuss
Pouce qui est de récupérer l'écriture de la formule en macro, dans le menu
Outils/Macro/Nouvelle Macro
allume l'enregistreur de macro

tu te mets sur une cellule contenant ta formule, F2 pour l'éditer, [Entrée]
et tu arrête l'enregsitrement.

Dans l'éditeur Visual Basic (même menu que ci-dessus) en fouillant dans le
module1 tu vas trouver ta formule traduite en VBA.

Pour l'affecter à toutes les cellules qui vont bien :

Range("X2:X" & Range("A65536").End(xlUp).Row).FormulaR1C1 "=MaFormuleRecuperéeAL'EtapeDuDessus"

Avec X qui serait ta colonne de destination de ta formule et A la colonne
contenant à coup sûr le plus grand nombre de données.

Je reste à dispo si besoin.

John


"Vader" a écrit dans le message de
news:
Marche pas ... excel refuse de prendre une forumle en référence


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("

";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.


";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("




";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"



-

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine









Avatar
Vader
J'avais déjà essayé ... hélas j'obtiens une erreur d'execution.

En effet, je recup le code suivant :

Range("AL41").Select
ActiveCell.FormulaR1C1 = _
"=RC37=0 0 ISERROR(VLOOKUP(CONCATENATE(LEFT(RC36,6),"" -
"",RIGHT(LEFT(RC37,14),6)),DATA_FLOW!R1C1:R350C13,MATCH(LEFT(R35C,FIND(""
"",R35C)-1),DATA_FLOW!R1,0),0))?0 RIGHT(LEFT(RC36,20),11)=""Val. Allow.""
CONCATENATE(LEFT(RC36,6),"" - "",RIGHT(LEFT(RC37,14),6))I"
Range("AL42").Select

Ok ... donc si j'execute la macro je devrais trouver le même résultat que la
fonction xls ... seulement l'enregistreur n'a pas l'air de comprendre toute
la forumle, du coup j'obtiens une 1004 "Application Defined or Object Defined
Error".

Aih ... je vois même pas les IF() L'enregistreur Macro comprend-t-il les
imbrications ?

Par contre, le modèle ci-dessous est intéressant :
Range("X2:X" & Range("A65536").End(xlUp).Row).FormulaR1C1 "=MaFormuleRecuperéeAL'EtapeDuDessus"

C'est pour cela que je cherchais un bouquin ou un site qui me donne les
interfaces Xls / vba pour le parametre FormulaR1C1.



Pouce qui est de récupérer l'écriture de la formule en macro, dans le menu
Outils/Macro/Nouvelle Macro
allume l'enregistreur de macro

tu te mets sur une cellule contenant ta formule, F2 pour l'éditer, [Entrée]
et tu arrête l'enregsitrement.

Dans l'éditeur Visual Basic (même menu que ci-dessus) en fouillant dans le
module1 tu vas trouver ta formule traduite en VBA.

Pour l'affecter à toutes les cellules qui vont bien :

Range("X2:X" & Range("A65536").End(xlUp).Row).FormulaR1C1 > "=MaFormuleRecuperéeAL'EtapeDuDessus"

Avec X qui serait ta colonne de destination de ta formule et A la colonne
contenant à coup sûr le plus grand nombre de données.

Je reste à dispo si besoin.

John


"Vader" a écrit dans le message de
news:
Marche pas ... excel refuse de prendre une forumle en référence


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("

";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.


";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("




";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"



-

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine














Avatar
Vader
Ah oui il faut quant même que je te remerci de ton aide ...


J'avais déjà essayé ... hélas j'obtiens une erreur d'execution.

En effet, je recup le code suivant :

Range("AL41").Select
ActiveCell.FormulaR1C1 = _
"=RC37=0 0 ISERROR(VLOOKUP(CONCATENATE(LEFT(RC36,6),"" -
"",RIGHT(LEFT(RC37,14),6)),DATA_FLOW!R1C1:R350C13,MATCH(LEFT(R35C,FIND(""
"",R35C)-1),DATA_FLOW!R1,0),0))?0 RIGHT(LEFT(RC36,20),11)=""Val. Allow.""
CONCATENATE(LEFT(RC36,6),"" - "",RIGHT(LEFT(RC37,14),6))I"
Range("AL42").Select

Ok ... donc si j'execute la macro je devrais trouver le même résultat que la
fonction xls ... seulement l'enregistreur n'a pas l'air de comprendre toute
la forumle, du coup j'obtiens une 1004 "Application Defined or Object Defined
Error".

Aih ... je vois même pas les IF() L'enregistreur Macro comprend-t-il les
imbrications ?

Par contre, le modèle ci-dessous est intéressant :
Range("X2:X" & Range("A65536").End(xlUp).Row).FormulaR1C1 > "=MaFormuleRecuperéeAL'EtapeDuDessus"

C'est pour cela que je cherchais un bouquin ou un site qui me donne les
interfaces Xls / vba pour le parametre FormulaR1C1.



Pouce qui est de récupérer l'écriture de la formule en macro, dans le menu
Outils/Macro/Nouvelle Macro
allume l'enregistreur de macro

tu te mets sur une cellule contenant ta formule, F2 pour l'éditer, [Entrée]
et tu arrête l'enregsitrement.

Dans l'éditeur Visual Basic (même menu que ci-dessus) en fouillant dans le
module1 tu vas trouver ta formule traduite en VBA.

Pour l'affecter à toutes les cellules qui vont bien :

Range("X2:X" & Range("A65536").End(xlUp).Row).FormulaR1C1 > > "=MaFormuleRecuperéeAL'EtapeDuDessus"

Avec X qui serait ta colonne de destination de ta formule et A la colonne
contenant à coup sûr le plus grand nombre de données.

Je reste à dispo si besoin.

John


"Vader" a écrit dans le message de
news:
Marche pas ... excel refuse de prendre une forumle en référence


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("

";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.


";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois MaF.
Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur les
3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("




";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"



-

";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("



";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de calcul ?
Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine
















Avatar
Patrick BASTARD
Bonjour, *Vader*

Surprenant...
Quelle version ?
Sur 2002, pas de problème.
Par contre, il faut entrer ta formule "à la mimine".
Le copier/coller n'est pas accepté.

--
Bien amicordialement,
P. Bastard

Marche pas ... excel refuse de prendre une forumle en référence


Bonjour, *Vader*

Et si tu affecte un nom à ta formule :

Insertion, Nom, Définir, MaF
Fait référence à :
=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

Au lieu de copier 94500 fois cette formule, tu copieras 94500 fois
MaF. Qu'en penses-tu ?

--
Bien amicordialement,
P. Bastard


Bonjour,

Voilà mon dilemme j'ai un tableur qui cherche des données dans une
base de données ... ça représente un tableau de 3500 lignes et 27
colonnes ...

Problèmes :
1) 30 Mo le fichier excel c'est chaud !
2) Excel plante quant je fais la copie de la forumle suivante sur
les 3500*27 cellules.

=IF($AH36=0;0;IF(ISERROR(VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0));0;IF(RIGHT(LEFT($AG36;20);11)="Val.
Allow.";VLOOKUP(CONCATENATE(LEFT($AG36;6);" -
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0)*-1;VLOOKUP(CONCATENATE(LEFT($AG36;6);"
-
";RIGHT(LEFT($AH36;14);6));DATA_FLOW!$A$1:$M$350;MATCH(LEFT(AI$35;FIND("
";AI$35)-1);DATA_FLOW!$1:$1;0);0

En gros elle recherche le croisement de 3 données (2 en ligne + 1 en
colonne).

La question est la suivante :

Est-il possible de faire une macro qui ai la même fonction de
calcul ? Est-ce plus léger ?
Est-ce plus rapide ?

Merci d'avance,

Antoine






1 2