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   -
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!



A voir également:

4 réponses

f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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???)
1
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
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 :
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.
1
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
0
Thibodeau19 Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   2
 
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.
0