Déclencher le calcul de fonctions VBA

Fermé
Thibodeau19 Messages postés 29 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 23 janvier 2015 - 21 févr. 2013 à 14:26
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 4 mars 2013 à 07:44
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 17268 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 29 mars 2025 1 713
1 mars 2013 à 10:10
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 mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 261
Modifié par eriiic le 4/03/2013 à 08:18
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 17268 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 29 mars 2025 1 713
21 févr. 2013 à 15:35
0
Thibodeau19 Messages postés 29 Date d'inscription jeudi 21 février 2013 Statut Membre Dernière intervention 23 janvier 2015 2
28 févr. 2013 à 21:15
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