Macro exécution longue

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,
Très profane en VBA, je fais mes macros uniquement avec l'aide d'excel (ou presque LOL).
Dans le classeur joint, j'ai un soucis d'exécution d'une macro : Recap que je lance manuellement à partir de la feuille "Recap" en cliquant sur "calcul données".

C'est hyper long en exécution .... et je n'arrive pas à modifier pour que cette macro s'exécute dans un temps "plus normal" à ce qu'il me semble.

Plus encore, j'ai besoin d'augmenter le nombre de lignes à traiter.

En effet, mes feuilles R1 à R12 sont prévues pour un traitement macro de 201 lignes et je dois les passer à 350.
Quand je fais la modification des macros, excel n'y arrive plus et se plante.

J'ai donc besoin de votre aide et je vous en remercie vivement.
Amicalement,
Lionel,
 

Pièces jointes

Re : Macro exécution longue

BOnjour

Pour ma part, je partirai sur une autre philosophie, bien plus adaptée à excel : au lieu de saisir tes données dans X feuilles différentes, tu les saisis toutes au kilomètre dans une unique base de données et à partir de là tu génères les différentes feuilles par "référence" (R1, R2, R3...).
Regarde ce fil, ce sont les mêmes conseils que je viens de proposer au demandeur.
https://www.excel-downloads.com/threads/aide-a-propos-du-gestionnaire-de-noms-et-autre.213370/
Là tu t'embarques dans une usine à gaz, et même en optimisant tes macros, tu auras toujours un fichier lourd, et comportant de nombreux risques d'erreur. Il est infiniment plus simple de ne contrôler qu'une seule base de données exploitée par un TCD. Les slicers te permettent ensuite en un clic de visualiser tout ce que tu souhaites, de générer par un simple doubleclic une extraction de ce TCD sur une nouvelle feuille avec un type de référence si tu dois la conserver pour tes archives par exemple.

Un conseil +++ : transforme tes tableaux en vrais tableaux excel : acceuil/style/mettre sous forme de tableau. Ce n'est pas seulement pour l'esthétique, très loin de là, ça t'ouvre des tas d'outils très pratiques
Ce lien n'existe plus

Si vraiment tu veux des macros (franchement dans ton cas je pense que tu n'en n'as pas besoin si tu utilises un TCD et des tableaux excel), je te conseille de passer un peu de temps à voir comment les améliorer, en tout premier lieu en supprimant les instructions inutiles générées par l'enregistreur de macros, et en particulier les .select. PLus d'infos ici
Ce lien n'existe plus (regarde en particulier Ce lien n'existe plus)
 
Re : Macro exécution longue

Bonjour,

Voici 2 lignes de code qui réduisent les temps

à mettre en début de macro

Application.Calculation = xlCalculationManual ' ne relance plus les calculs au changement d'une cellule
Application.ScreenUpdating = False ' ne met pas à jour l'écran au changement d'une cellule


et en fin de macro
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


Amicalement
 
Re : Macro exécution longue

Bonjour Misange 🙂,
Bonjour à tous 🙂,

J'ai pris en compte tes conseils et j'ai créé une seule feuille "base" et "BaseS".

Et c'est vrai que c'est bcp mieux 🙂.

j'ai encore des trucs que je ne sais pas faire.
Ayant bcp cherché sur le net, relevé des codes mais pas réussi à adapter, je me tourne à nouveau vers vous et j'ai besoin de ton aide si tu le veux bien ( et de l'aide de tous LOL).

1 - Dans la feuille "BaseS", je voudrais supprimer toutes les lignes si la colonne D contient "C"
2 - Dans la feuille "Base", je voudrais supprimer toutes les lignes si la colonne D contient "S"

D'autre part, j'ai intégré la code suivant dans mes macros :

Sub TriNomsS()
For Each C In [A2:B5000]
C.Value = Application.Trim(C.Value)
Next

Sub TriNoms()
For Each C In [A2:B5000]
C.Value = Application.Trim(C.Value)
Next

C'est très long en exécution !!!

Peut-on raccourcir ce temps d'exécution ?

je vous joins mon classeur

Un grand merci pour votre aide.
Amicalement,
Lionel,
 

Pièces jointes

Dernière édition:
Re : Macro exécution longue

Bonjour,

Je ne comprends pas trop le problème.

La macro Trinoms exécute un tri sur la colonne 1 qui ne contient pas de valeur ??

les lignes :
For Each C In [A2:B5000]
C.Value = Application.Trim(C.Value)
Next

sont censées supprimer les blancs avant et après sur chaque cellule.

Je ne sais pas si tu entres souvent des nouvelles données mais est-il nécessaire de réaliser cette action après chaque tri. On pourrait imaginer cette commande juste après ajout de données

Amicalement
 
Re : Macro exécution longue

Bonjour homepyrof53,
Bonjour à tous,

Merci de m'avoir répondu.

Dans mes feuilles "Noms et NomsS", il y a bien des données en colonnes A et B.

Dans ces feuilles, j'en souvent des données nouvelles qui proviennent d'un logiciel de production (extraction sous excel), mais qui me donne des cellules avec des espaces vides un peu partout et cela me pose un problème de recherches.

Cependant, effectivement, je ne suis pas obligé de faire cette action à chaque ouverture et suite à ton mot, j'ai modifié pour le faire qu'aux moments utiles.

C'est déjà un gain de temps.

Cependant, quand j'active ces macros, c'est toujours aussi long et j'ai quand même besoin de lancer souvent.

Amicalement,
Lionel,
 
Re : Macro exécution longue

Bonjor,

J'ai fait cette petite macro :
Code:
Private Sub TriNoms()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
t1 = Timer
For Each C In [A2:B5000]
    If C.Value <> "" Then C.Value = Application.Trim(C.Value)
Next
Range("A2").Select
t = Timer - t1
MsgBox t
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

J'ai ajouté ScreenUpdating et Calculation, et
If C.Value <> "" Then C.Value = Application.Trim(C.Value)

qui exécute trim que si nécessaire

Sur ton fichier fourni on passe d'un temps de 0,625 à 0,06, divisé par 10
 
Re : Macro exécution longue

Re-bonjour et à tous,

Ha oui !!! c'est nettement meilleur car - de 3 secondes alors que ça prenait au moins 1 mn.

je me suis permis de supprimer :

Range("A2").Select
t = Timer - t1
MsgBox t

Je pense que cela n'a pas d'incidence ?

Vraiment Merci à toi,
Amicalement,
Lionel,
 
Re : Macro exécution longue

Bonjour

Pas mal d'améliorations à prévoir :
1) au lieu de prévoir 5000 lignes dont 4960 sont vides, utilise les tableaux excel et ne travaille que sur ce qui est strictement nécessaire
Ce lien n'existe plus

Tu élimines ainsi tous tes boutons de tri : ils sont automatiquement présents en tête de chaque colonne et le tri intégré à excel est BEAUCOUP plus rapide que le tri que tu peux faire par macro.

Concernant par exemple ce bout de code :
Code:
 Sheets("Nom").Select
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "=IF(RC[1]>0,CONCATENATE(RC[3],RC[4]),""zzzzzz"")"
    Range("A2").Select
    Selection.Copy
    Range("A3:A5000").Select
    ActiveSheet.Paste
    Columns("A:A").Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Call TriNoms

Il n'y a absolument AUCUN intérêt à écrire une formule dans la feuille. C'est très long en temps de calcul. Il vaut mieux faire le calcul dans la macro et placer seulement le résultat dans la feuille.
Il faut absolument éviter de sélectionner des objets dans excel :

Code:
application.screenupdating=false
For each c in range("A2").end(xldown)
if c.offset(0,1)>0 then
c=c.offset(0,3)&c.offset(0,4)
else
c="zzzzzzzz"
end if

Mais surtout, ce code
Code:
Application.ScreenUpdating = False
For Each c In Sheets("nom").Range("A2").End(xlDown)
    If c.Offset(0, 1) > 0 Then c = trim( c.Offset(0, 3) & c.Offset(0, 4))
Next c
With ActiveWorkbook.Worksheets("Nom").ListObjects("Tab_noms").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("A2")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

te fait le boulot, trim et tri inclus, en un temps record. J'ai transformé ici la zone A1:L578 de la feuille nom en tableau excel que j'ai nommé Tab_noms.
Même chose pour les autres bouts de macros que tu appliques à l'ouverture.

Pour supprimer les lignes du tableau base (mis sous forme de tableau et nommé Tab_base) si il y a un S dans la troisième colonne
Code:
Dim MaListe As ListObject
Dim c As Range
Set MaListe = Sheets("base").ListObjects("Tab_base")
For Each c In MaListe.DataBodyRange.Columns(3).Cells
    If c = "S" Then Range(c.Offset(0, -2), c.Offset(0, 13)).Delete
Next c
 
Re : Macro exécution longue

Bonjour Misange,

Merci pour ce travail, vraiment merci.
Oui, beaucoup d'améliorations à faire dans mes petits trucs et si tu voyais mes autres classeurs Waoooo !!!

je vais tenter de comprendre tout ça et je vais m'en inspirer.

Encore Merci,

Je te souhaite une très bonne soirée 🙂
Amicalement,
Lionel,
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
66
Affichages
727
Réponses
18
Affichages
336
  • Question Question
Microsoft 365 macro TCD
Réponses
4
Affichages
241
  • Question Question
Autres MACRO
Réponses
20
Affichages
485
Retour