Simplification de code puisqu'il est très lent

Bonjour cher forum!

Je ne sais pas si vous allez pouvoir m'aider puisque c'est assez complexe et je ne suis pas le meilleur en VBA. J'ai un fichier Excel où j'ai créer un échancier pour faire le suivi des projets de construction. Il fait exactement ce dont j'ai besoins, les codes fonctionnes sans encombre.

Toutefois, maintenant que tous les codes VBA sont en place dans la feuille, mais aussi les formules qui se retrouve dans les cellules, il s'avère que tout est très lent et n'est plus utilisable sans frustration à cause de la lenteur. Je me demandais alors si vous pouviez m'aider à alléger les codes ou les formules afin que le fichier soit adéquatement utilisé. J'ai tenté de de faire des Exit Sub pour alléger le VBA et d'insérer des Application.EnabledEvents, mais rien n'y fait et malheureusement mes connaissance s'arrête là...

Je vous joins le ficher :

Est-ce que quelqu'un connait le remède?! Merci d'avance à tous :)

bonjour CedL,

colonne G est une monstruosité de formule, surtout le "indirect", qui est "volatile" (à récalculer chaque fois). N'est ce pas possible de remplacer la colonne G par une fonction personnalisée, qui fait exactement la même chose que cette formule ?

Un simple essai, (ne sauvegarde pas votre fichier après cette manipulation ou sauvegarde avec un autre nom), si vous copier la colonne G et vous collez "les valeurs" sur la colonne elle-même, alors toutes les formules "G" sont disparues. Du coup, le fichier est devenu plus vite ?

Bonjour BsAlv,

Oui ma formule est très volumineuse jtu as raison, je n'ai malheureusement pas pu la faire plus petite pour qu'elle fonctionne avec les liens, mais si jamais quelqu'un à une idée pour la réduire ca serait déjà bien!

Je pourrais effectivement enlever toutes les formules et les mettre seulement quand il y a une tâche d'ajouter, mais je vais arriver au même, c'est qu'une fois l'échéancier fait, il va y avoir environ 250 tâches alors 250 formules dans la plus part des cellules...

re,

pouvez-vous me donner un fichier avec >10 lignes d'exemples.

Ce sera une fonction, environ comme celle ci

La fonction "DateEtape" me semble trop compliquée, elle fait qoui exactement ?

Pouvez-vous aussi dire (juste que signifie cette abréviation) à quoi sert DD, DF, FD, FF ?

Function CedL(Lien, S As Range, Dates, Jr, Ant, Déc, Jours_Spéciaux)
     With Sheets("ÉCHÉANCIER DU PROJET")
          If StrComp(S, "S", 1) Then
               a = DateEtape(True, S.Row)
          Else
               Select Case UCase(Lien)
                    Case "DD": a = WorksheetFunction.WorkDay_Intl(.Cells(Ant + 8, 7), Déc, Jours_Spéciaux)
                    Case "DF": a = WorksheetFunction.WorkDay_Intl(.Cells(Ant + 8, 7), Déc - IIf(Jr = 0, 1, Jr), Jours_Spéciaux)
                    Case "FD": a = WorksheetFunction.WorkDay_Intl(.Cells(Ant + 8, 8), Déc + 1, Jours_Spéciaux)
                    Case "FF": a = WorksheetFunction.WorkDay_Intl(.Cells(Ant + 8, 8), Déc + IIf(Jr = 0, 0, -Jr + 1), Jours_Spéciaux)
                    Case Else: a = "???"
               End Select
          End If
     End With

     CedL = a
     '=ALS.FOUT(ALS($C9="S";DateEtape(WAAR;RIJ());
     'ALS($L9="DD";WERKDAG.INTL(INDIRECT(ADRES($M9+8;7));$N9;TEKST.SAMENV(TB_Jourdetravail);Jours_Fériés);
     'ALS($L9="DF";WERKDAG.INTL(INDIRECT(ADRES($M9+8;7));ALS($F9=0;$N9-1;$N9-$F9);TEKST.SAMENV(TB_Jourdetravail);Jours_Fériés);
     'ALS($L9="FD";WERKDAG.INTL(INDIRECT(ADRES($M9+8;8));$N9+1;TEKST.SAMENV(TB_Jourdetravail);Jours_Fériés);
     'ALS($L9="FF";WERKDAG.INTL(INDIRECT(ADRES($M9+8;8));ALS($F9=0;$N9;$N9-$F9+1);TEKST.SAMENV(TB_Jourdetravail);Jours_Fériés);"")))));"")

End Function

Rebonjour!

Tout d'abord merci beaucoup pour ton aide!

Et oui bien sûr, pour commencer les abréviations dans la colonne Lien "DD", "DF", "FD" et "FF sert à définir le lien continu entre les autres tâches et signifie :
- DD = Début Début (le début de la tâche avant est aussi le début de la présente tâche)
- DF = Début Fin (le début de la tâche avant est aussi la fin de la présente tâche)
- FD = Fin Début (la fin de la tâche avant est aussi le début de la présente tâche)
- FF = Fin Fin (la fin de la tâche avant est aussi la fin de la présente tâche)

Dans la colonne Lien, on vient indiquer comment on veut que le lien ce fasse avec une autre tâche. Ensuite dans la colonne Ant. (Antécédant) on vient indiquer le numéro de la ligne pour indiquer avec quel tâche qu'on veut faire le lien. Pour finir dans la colonne Déc. (Décaler) on peut décaler les dates en jours au besoin. Exemple, si on veut que la tâche à la ligne 2 débute un jour après le début de la tâche à la ligne 1, nous allons inscrire dans à la ligne de la tâches : DD(colonne Lien) - 01 (colonne Ant.) - 1 (colonne Déc.)

J'ai fait un exemple bien entendu plus concret avec quelques éléments pour donner une bonne idée de ce à quoi ça peut ressembler. La raison aussi pour laquelle il y a un codage dans la feuille en évènement Change est parce que des fois on peut modifier des dates manuels à cause d'un décalage de l'échéancier, donc ça ne suit plus les liens "DD", "FD", etc. J'ai également mis cette exemple à la ligne15. Mais si jamais on veut refaire le lien, la formule ce remet automatiquement.

La fonction DateEtape sert à indiquer la première et la dernière date d'un groupe de tâches qui est défini par le "S" dans la colonne C. Tu pourras également voir cette exemple dans le fichier joint.

Voici le fichier en exemple :

re,

premier essai, une macro "Echeancier()", qu'on doit, pour le moment encore lancer manuellement, parce que le "Worksheet_Change"-event est encore occupé par vos macros. Elle calcule 300 tâches en 30 msec et copie le résultat vers la plage BI9:BJ308 et ces cellules sont égales aux cellules G9:H308.

Donc, si vous êtes d'accord, on remplace toutes les formules des colonnes G:H par cette macro et on verra si tout fonctionne encore.

J'utilise la colonne J et K pour annuler le calcul du début et fin et prendre directement ces valeurs. (Pour les tâches 02 et 15, il n'y avaient pas des formules pour le début )

Une chose bizarre, si vous commencez un tâche le samedi (par exemple tâche 02 = samedi 14/10/2023 et cela prend un jour le résultat est le même jour, pour moi, cela doit être le lundi, parce que le samedi, on ne travaille pas.

Le plus gros gain de temps, c'est qu'on lit toutes les données 1 fois au début et on écrit le résultat global une fois vers le fichier. Puis quand vous changez quelque chose hors les colonnes A:N, cela ne provoque pas une récalculation.

Re,

J'ai tenté plusieurs méthodes, mais je pense que je comprends mal la nouvelle macro "Echeancier()". Si je la met dans l'évènement Change rien ne ce passe non plus.

Certaine cellule de la colonne G ou H peuvent être des dates manuels d'où le codage dans la feuille. Il faut que si finalement la date redevient automatisé à partir des colonnes Lien et Ant, les colonnes G ou H retrouve leurs codes également.

Est-ce que je dois insérer la macro par "Call Echeancier" quelque part dans l'évenement Change de la feuille?

re,

les formules de G:H sont disparu et remplacées par le résultat de la macro "Echeancier" qui est lancée par le "worksheet_Change"

Je vois que cette macro fait sa tâche en 0.05 sec, mais ça prend 0.8 sec pour mettre à jour la feuille (les MFCs et les calcules des colonnes R:BG. La macro peut aussi faire une partie/tout de cela . Voir feuille MFCs, là vous voyez toutes les MFCs de votre feuille, les MFCs 4 à 9 (entouré de rouge) sont facile à remplacer par la macro et je pense que ça fait gagner du temps

Donc, maintenant,

1. Ce remplacement des formules par la macro, c'est mieux ?

2. Remplacer quelque MFCs par une macro ?

Bon matin!

Je comprends un peu mieux, merci! ¨Ca va effectivement plus vite, je vais partir avec ça et voir ce que je peux faire aussi avec les MFC's.

Merci encore à toi!

Rechercher des sujets similaires à "simplification code puisqu tres lent"