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
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
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
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
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???)
j'ai teste l'enchainement des fonctions, pas de ralentissement. Combien de fois appelez vous cette enchainement (c'est dans une boucle infernale, ou???)
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
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 :
=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.
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
21 févr. 2013 à 15:35
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
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.
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.