Actualiser Function

Bonjour,

J'ai un fichier avec une macro qui s’exécute à l'ouverture et qui check des centaines de cellules.

J'ai également une Function sur une dizaine de cellules qui doit s'actualiser une fois la macro terminée.

Le problème est que si je rajoute "Application.volatile" dans la function, celle-ci va se recalculer à chaque cellule checkée et ça allonge considérablement le temps d'exécution de la macro voire faire planter mon fichier.

J'ai également essayé avec Application.Calculate mais rien à faire ma fonction ne se recalcule pas. Je suis obligé de rentrer dans chaque cellule avec ma fonction et de faire entrée.

Avez vous une autre solution ?

PS : Si besoin du fichier, n'hésitez pas à me le demander

En vous remerciant !

Braters

bonjour,

peux-tu mettre un fichier représentatif de ton classeur et de ses données ?

Bonjour braters

As tu déjà essaye de mettre ta fonction

la macro ainsi construite ce déclenche uniquement a la sélection de la feuille

Private Sub Worksheet_Activate()

fonction

End Sub

Bonjour,

Sans l'instruction "Application.volatile", pour que ta fonction recalcule, il faut que soit modifié un des éléments auxquels elle fait référence.

Bonjour,

Merci pour vos réponses.

Je vous met le fichier en pièce jointe.

Ce sont les cellules en jaune dans la feuille "CENTRALISATION" qui ne s'actualise pas après l'exécution de la macro.

En vous remerciant !

Braters

20test-maint.xlsm (748.98 Ko)

Bonjour,

As-tu essayé :

Public Function Ctrl(Compte&)
' Ajout de instruction  Application.Volatile '''''''''''''''''''''''''''''''''''
Application.Volatile
    For i = 1 To 9
        With Sheets(i)
            For Each cel In .Range("A1:A300")
                Cpt = Left(cel, 6)
                If Not IsNumeric(Cpt) Then GoTo suiv
                If CLng(Cpt) > CLng(Compte) Then GoTo suiv
                If Cpt = Compte Then
                    DebLig = cel.Row
                    Derlig = .Range("A" & DebLig & ":A300").Find("S/TOTAL ").Row
                    Total = Total + .Range("V" & Derlig).Value
                    Exit For
                End If
suiv:
            Next cel
        End With
    Next i

    Ctrl = Total

End Function

Tu peux également à la fin de ta macro Actualisation ajouter

Columns("T:T").Calculate

En espérant que cela t'aide ...

Bonjour James007,

le problème avec .Volatile c'est que pour chaque cellule mise à jour avec ma macro Actualiser, les cellules avec les fonctions vont s'actualiser ce qui augmente grandement la durée de la macro, voire fait planter Excel

J'ai essayé avec

Columns("T:T").Calculate

Mais ca n'a pas l'air de fonctionner !

Je pense que thev a raison, il faut modifier un élément auquel la fonction fait référence, mais je ne vois pas comment faire.

Peut-être une boucle sur les cellules non vides de la colonne T, récupérer la formule et la réécrire du style

ActiveCell.Formula = FormuleRécupérée

C'est juste une idée comme ca, non testée lol !

Merci encore

Re,

De mon côté, je viens tout juste de tester ...

Columns("T:T").Calculate

Et çà fonctionne ..

Arf, pourtant je l'ai bien mis après le MsgBox, mais mes cellules restent en #VALEUR jusqu'à ce que je les actualise manuellement

Je vais réessayer

Bonjour,

tu peux aussi améliorer ta fonction.

C'est plus efficace de rechercher la bonne ligne que de lire 2700 cellules, ça sera toujours ça de gagné.

Public Function Ctrl2(Compte&)
    Dim c As Range, i As Long
    For i = 1 To 9
        With Sheets(i)
            Set c = .Columns(1).Find(Compte, , xlValues, xlPart)
            If Not c Is Nothing Then
                Set c = .Columns(1).Find("S/TOTAL ", c, xlValues, xlPart)
                If Not c Is Nothing Then Ctrl2 = Ctrl2 + .Cells(c.Row, "V")
            End If
        End With
    Next i
End Function

Pour éviter le .volatile il faudrait lui passer en paramètres les colonnes A et V de tes 9 feuilles...

Autant faire le [T:T].calculate, ou bien coller ta formule ou le résultat à partir du programme principal.

Ceci dit quelque chose m'échappe.

Si tu es sûr de ton programme d'actualisation, quel besoin as-tu de faire un double contrôle ?

Et si tu n'en es pas sûr et bien débogue-le que les résultats soient justes.

C'était valable quand on faisait les totaux à la main le double contrôle.

eric

Bonjour Eriiic,

En effet tu as raison, j'avais oublié le xlPart de la fonction .Find ! Merci

Le problème c'est que je n'arrive pas à utiliser le [T:T].Calculate, mes fonctions restent en #VALEUR! après l'exécution de la macro

Le problème n'est pas la macro mais les données qu'elle utilise. Je reprend ce fichier qui était complété entièrement à la main et le problème est que je peux avoir des différences pour un même libellé comme "DOLLIE" ou "DOLLIES", "CDETEC" ou "CDETECT" ou bien une ligne sur laquelle le symbole n'est pas renseigné.

Le deuxième contrôle me permet donc de voir sur quel compte je peux avoir des erreurs de ce type si le total n'est pas égale à celui escompté.

Merci en tout cas !

EDIT: Désormais, certaines cellules avec fonctions s'actualisent bien et passent en "Ok" mais d'autres restent en "#VALEUR!", je n'y comprend pas grand chose ...

Excel n'est pas trop bête, il ne recalcule une formule que si un antécédent a changé.

Au début de ta macro la cellule passe à #VALEUR! (pour une raison que j'ignore), et ton antécédent ($A31) ne change pas, il ne ré-évalue donc pas la formule puisque pour lui elle a déjà été calculée.

Soit tu ré-écris avec .$A31.value=.$A31.value sur toutes les cellules concernées,

soit tu lui d'oublier qu'il l'a déjà évaluée avec .dirty :

.Range("T:T").Dirty
.Range("T:T").Calculate

Par ailleurs si ton Workbook_Open() est équivalent à Actualiser fait :

Private Sub Workbook_Open()
    Actualiser
End Sub

Un seul code à maintenir, et c'est mieux qu'il soit dans un module standard

eric

Eriiic,

Voilà quelque chose dont j'ignorais l'existence

J'ai placé le .Dirty, .Calculate et mes cellules n'affichent plus d'erreurs, j'en conclus donc que tu as trouvé la solution à mon problème.

Et c'est exact pour le workbook_open, bien que je l'ai mis sur _BeforeClose

Merci à tout le monde et particulièrement à toi Eriiic !

A la prochaine !

ceci étant réglé je reviens sur

le problème est que je peux avoir des différences pour un même libellé comme "DOLLIE" ou "DOLLIES", "CDETEC" ou "CDETECT" ou bien une ligne sur laquelle le symbole n'est pas renseigné.

C'est à ce niveau qu'il faut intervenir, contrôler après c'est trop tard et engendre des pertes de temps inutiles.

Il ne devrait y avoir que des saisies par liste de choix qui empêche de mettre autre chose et fiabilise l'ensemble.

sans objet puisque problème réglé

Rechercher des sujets similaires à "actualiser function"