Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Convertir Formule en VBA

Rabeto

XLDnaute Occasionnel
Bonjour,

Quelqu'un sait comment transformer cette formule en code VBA ou macro svp

=(SIERREUR(SOMME(AF2:AG2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"")))/$AE2;0)*SIERREUR(($AF2-ECART.MOYEN(SI($AD:$AD=$AD2;$AF:$AF;"")))/$AE2;0))+
(SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"")))/$AE2;0)*SIERREUR(($AG2-ECART.MOYEN(SI($AD:$AD=$AD2;$AG:$AG;"")))/$AG2;0));0))-
(SIERREUR(SOMME(AH2:AI2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"")))/$AE2;0)*SIERREUR(($AH2-ECART.MOYEN(SI($AD:$AD=$AD2;$AH:$AH;"")))/$AE2;0))+
(SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"")))/$AE2;0)*SIERREUR(($AI2-ECART.MOYEN(SI($AD:$AD=$AD2;$AI:$AI;"")))/$AI2;0));0))

A appliquer dans la colonne VU à partir de la ligne 2 à ligne 65

Le but est d'alléger le chargement de la feuille, car la formule est matricielle, et plante le fichier

Merci,
 
Solution
Maintenant si l'on veut absolument du VBA on mettra ce code dans un module standard :
VB:
Sub Valider()
[VU2].FormulaLocal = _
    "=(SIERREUR(SOMME(AF2:AG2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AF2-ECART.MOYEN(SI($AD:$AD=$AD2;$AF:$AF;"""")))/$AE2;0))" _
    & "+(SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AG2-ECART.MOYEN(SI($AD:$AD=$AD2;$AG:$AG;"""")))/$AG2;0));0))" _
    & "-(SIERREUR(SOMME(AH2:AI2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AH2-ECART.MOYEN(SI($AD:$AD=$AD2;$AH:$AH;"""")))/$AE2;0))" _
    &...
C

Compte Supprimé 979

Guest
Bonjour Rabeto

Oui, c'est simple, utilisez l'enregistreur de macros


Vous entrez en mode édition [F2] dans la cellule qui contient la formule et [Entrée]
Vous arrêtez l'enregistreur, vous avez alors le code de la formule (normalement)

Il faut ensuite la modifier pour remplacer le chiffre 2 par un # (par exemple)
Et utiliser la fonction REPLACE()

A+
 

patricktoulon

XLDnaute Barbatruc
re
bonjour @BrunoM45
là tu converti pas
tu encode la formule en vba c'est pas la même chose
on ne converti pas une formule
on converti le raisonnement de la formule c'est pas la même chose
et pour info vu le caractère matriciel de la formule l'evaluate de cet encodage renvera error 2015
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

si le but est d'alléger le fichier et qu'il s'y prête, tu devrais plutôt copier-coller la valeur, sauf sur la première ligne où tu conserves la formule. Elle restera plus facilement modifiable qu'en vba.
En cas de modif ou d'ajout, tu copies-colles la formule sur les lignes concernées et tu refais un collé valeur.
Il faudra t'assurer de la fin des calculs avant de faire le copier-coller valeur :
VB:
    ' coller formule
    ' ...
    Do Until Application.CalculationState = xlDone
        DoEvents
    Loop
    ' copier coller valeur
    ' ...'

eric
 
C

Compte Supprimé 979

Guest
Salut Patrick
Il n'est indiqué nulle part qu'il faut convertir la formule

L'encoder pour moi c'est plus simple pour quelqu'un qui ne connait pas le VBA
On inscrit la formule, on fait un copier/coller valeur et le tours est joué

Nous sommes en fin d'année, le cerveau à besoin de se reposer
 

job75

XLDnaute Barbatruc
Bonsoit à tous,

Je ne vois pas pourquoi on parle de VBA :

- copier la formule du post #1 et entrez-la en cellule VU2

- valider VU2 matriciellement par Ctrl+Maj+Entrée

- tirer VU2 vers le bas jusqu'à VU65, le calcul prend un peu de temps.

A+
 

job75

XLDnaute Barbatruc
Maintenant si l'on veut absolument du VBA on mettra ce code dans un module standard :
VB:
Sub Valider()
[VU2].FormulaLocal = _
    "=(SIERREUR(SOMME(AF2:AG2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AF2-ECART.MOYEN(SI($AD:$AD=$AD2;$AF:$AF;"""")))/$AE2;0))" _
    & "+(SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AG2-ECART.MOYEN(SI($AD:$AD=$AD2;$AG:$AG;"""")))/$AG2;0));0))" _
    & "-(SIERREUR(SOMME(AH2:AI2)/AE2;0)*SIERREUR((SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AH2-ECART.MOYEN(SI($AD:$AD=$AD2;$AH:$AH;"""")))/$AE2;0))" _
    & "+(SIERREUR(($AE2-ECART.MOYEN(SI($AD:$AD=$AD2;$AE:$AE;"""")))/$AE2;0)*SIERREUR(($AI2-ECART.MOYEN(SI($AD:$AD=$AD2;$AI:$AI;"""")))/$AI2;0));0))"
[VU2].Select
CreateObject("WScript.Shell").SendKeys "{F2}^+~" 'envoi des touches de validation matricielle
Application.OnTime 1, "Remplir" 'lancement différé
End Sub

Sub Remplir()
[VU2].AutoFill [VU2:VU65]
End Sub
et on exécutera la macro Valider.

Bonne nuit.
 

Rabeto

XLDnaute Occasionnel
Bonjour à tous,
merci pour vos réponses,
Le but étant d'alléger le chargement de la feuille avec la formule matricielle manuelle qui prend du temps et trop lourd

BrunoM45 : Oui J'ai fait la manip enregistrement macro mais la lenteur persiste,
eriiic : Je n'arrive pas à reproduire votre code
job75 : J'ai essayé le code, ça fonctionne mais il y a ce message qui s'affiche, mais ça marche

 

job75

XLDnaute Barbatruc
Bonjour Rabeto, le forum,

Je ne sais pas pourquoi vous avez ce message, il n'y en a pas chez moi.

Chez moi les 64 formules matricielles se calculent en 168 secondes, c'est bien long.

J'ai essayé en VBA d'utiliser FormulaArray mais la formule n'est pas acceptée, que ce soit en notation A1 ou en notation R1C1.

A+
 

Discussions similaires

Réponses
40
Affichages
3 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…