Déclencher le calcul de fonctions VBA
Thibodeau19
Messages postés
29
Date d'inscription
Statut
Membre
Dernière intervention
-
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je travaille sur un gros fichier Excel où j'utilise plusieurs fonctions VBA que j'ai moi-même programmées. Dans ce même fichier, j'utilise d'autres macros pour trouver une valeur cible par itérations.
Mon problème est que lorsque j'effectue ces itérations, toute la feuille se recalcule automatiquement à chaque itération, ce qui demande énormément de temps, en raison de la quantité importante d'équations complexes se trouvant dans le reste du fichier.
Je voudrais donc trouver un moyen de calculer ces fonctions uniquement lorsque les valeurs d'entrée de ces dernières changent.
J'espère avoir été assez clair. Merci pour votre aide!
Je travaille sur un gros fichier Excel où j'utilise plusieurs fonctions VBA que j'ai moi-même programmées. Dans ce même fichier, j'utilise d'autres macros pour trouver une valeur cible par itérations.
Mon problème est que lorsque j'effectue ces itérations, toute la feuille se recalcule automatiquement à chaque itération, ce qui demande énormément de temps, en raison de la quantité importante d'équations complexes se trouvant dans le reste du fichier.
Je voudrais donc trouver un moyen de calculer ces fonctions uniquement lorsque les valeurs d'entrée de ces dernières changent.
J'espère avoir été assez clair. Merci pour votre aide!
A voir également:
- Déclencher le calcul de fonctions VBA
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel gratuit calcul surface m2 - Télécharger - Outils professionnels
4 réponses
Bonjour,
j'ai teste l'enchainement des fonctions, pas de ralentissement. Combien de fois appelez vous cette enchainement (c'est dans une boucle infernale, ou???)
j'ai teste l'enchainement des fonctions, pas de ralentissement. Combien de fois appelez vous cette enchainement (c'est dans une boucle infernale, ou???)
Bonjour,
Es-tu obligé de les rendre volatiles ?
Si tu lui passes en paramètre d'entrée toutes les cellules dont elle dépend une fonction n'a pas besoin d'être volatile.
Elle ne sera réévaluée que si un de paramètre d'entrée change.
Ex :
=prod(A1;B1) ne sera évalué que si A1 ou B1 change, même si c'est le résultat de formules.
Sinon, après avoir désactivé le calcul automatique, tu peux ne recalculer qu'une partie de feuille que tu as besoin :
[Feuil1!A3:B5].calculate
rows(5).calculate
...
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Es-tu obligé de les rendre volatiles ?
Si tu lui passes en paramètre d'entrée toutes les cellules dont elle dépend une fonction n'a pas besoin d'être volatile.
Elle ne sera réévaluée que si un de paramètre d'entrée change.
Ex :
Function prod(a As Range, b As Range) As Double prod = a * b End Function
=prod(A1;B1) ne sera évalué que si A1 ou B1 change, même si c'est le résultat de formules.
Sinon, après avoir désactivé le calcul automatique, tu peux ne recalculer qu'une partie de feuille que tu as besoin :
[Feuil1!A3:B5].calculate
rows(5).calculate
...
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
En fait, je peux obtenir un temps de calcul raisonnable, mais je dois retirer la méthode application.volatile de mes fonctions, ce qui fait qu'elles ne se recalculent pas automatiquement lorsque je change certaines valeurs dans ma feuille, dont ces fonctions dépendent indirectement. Voici un exemple de quelques unes des fonctions que j'utilise:
Function x_barre_barres_N(x As Single) 'Calcul du centre de gravité des lits d'armatures
'Données d'entrée
recb = Range("rec_b") / 1000
If As_tot_N(x) = 0 Then
x_barre_barres_N = 0
Else
x_barre_barres_N = recb + diametre_barre_N(x) * (3 * As_45(x) + 7 / 2 * As_0(x)) / As_tot_N(x)
End If
End Function
Function dmin_N(x As Single) 'Calcul du bras de levier d
dmin_N = Htot_N(x) - x_barre_barres_N(x)
End Function
Function eprime_N(x As Single) 'Calcul du bras de levier e'
eprime_N = dmin_N(x) - x_barre_N(x)
End Function
Function Mr_pos_N(x As Single) 'Calcul du moment résistant positif pondéré Mr
'Données d'entrée
phi_s = Range("phi_s")
fy = Range("fy")
'Force de traction pondérée
Tr_max = phi_s * As_tot_N(x) * fy
'Moment résistant pondéré
Mr_pos_N = Tr_max * eprime_N(x) * 1000
End Function
Comme vous pouvez le voir, chaque fonction dépend d'un fonction précédente. En d'autres termes, toutes mes fonctions se calculent en chaîne. Cependant, seul le changement de la valeur d'entrée effectue le recalcul de la fonction.
Quelqu'un aurait une autre solution pour que mes fonctions se calculent toutes automatiquement, sans utiliser application.volatile qui ralentie considérablement le temps d'exécution de mes autres macros.
Function x_barre_barres_N(x As Single) 'Calcul du centre de gravité des lits d'armatures
'Données d'entrée
recb = Range("rec_b") / 1000
If As_tot_N(x) = 0 Then
x_barre_barres_N = 0
Else
x_barre_barres_N = recb + diametre_barre_N(x) * (3 * As_45(x) + 7 / 2 * As_0(x)) / As_tot_N(x)
End If
End Function
Function dmin_N(x As Single) 'Calcul du bras de levier d
dmin_N = Htot_N(x) - x_barre_barres_N(x)
End Function
Function eprime_N(x As Single) 'Calcul du bras de levier e'
eprime_N = dmin_N(x) - x_barre_N(x)
End Function
Function Mr_pos_N(x As Single) 'Calcul du moment résistant positif pondéré Mr
'Données d'entrée
phi_s = Range("phi_s")
fy = Range("fy")
'Force de traction pondérée
Tr_max = phi_s * As_tot_N(x) * fy
'Moment résistant pondéré
Mr_pos_N = Tr_max * eprime_N(x) * 1000
End Function
Comme vous pouvez le voir, chaque fonction dépend d'un fonction précédente. En d'autres termes, toutes mes fonctions se calculent en chaîne. Cependant, seul le changement de la valeur d'entrée effectue le recalcul de la fonction.
Quelqu'un aurait une autre solution pour que mes fonctions se calculent toutes automatiquement, sans utiliser application.volatile qui ralentie considérablement le temps d'exécution de mes autres macros.