J'ai une macro excel vba qui crée et forme un devis de vente. J'ai une fonction qui autofise les cellules fusionnées. J'utilise cette fonction pour autoformer les champs de description car certains d'entre eux sont longs et certains sont courts. Sur une citation typique, cette fonction est appelée environ 40 fois. La macro se complète sous une seconde. Si j'exécute la même macro exactement à nouveau (peut-être avec des réglages différents sur la façon dont elle affichera), cela prend plus de 30 à 60 secondes. Il n'y a rien dans le rest de la macro qui ralentit à chaque exécution sauf pour le bloc suivant:
Existe-t-il quelque chose qui pourrait rendre ce code plus lent pour le même set d'inputs?
Sub AutoFit_Height(ByVal Target As Range) Dim MergeWidth As Single Dim cM As Range Dim CWidth As Double Dim NewRowHt As Double With Target .MergeCells = False CWidth = .Cells(1).ColumnWidth MergeWidth = 0 For Each cM In Target cM.WrapText = True MergeWidth = cM.ColumnWidth + MergeWidth Next 'small adjustment to temporary width MergeWidth = MergeWidth + Target.Cells.count * 0.66 .Cells(1).ColumnWidth = MergeWidth .EntireRow.AutoFit NewRowHt = .RowHeight .Cells(1).ColumnWidth = CWidth .MergeCells = True .RowHeight = NewRowHt End With End Sub
Allez au début du corps principal du code (celui qui appelle ce sous-programme) et ajoutez
Application.ScreenUpdating = False
comme une des premières lignes. Ensuite, à la fin de cette fonction, après que ce sous-programme a été appelé, rallumez-le:
Application.ScreenUpdating = True
Cela empêchera de redessiner l'écran pour chaque modification de la taille des colonnes / lignes, ce qui entraînera un time d'exécution beaucoup plus rapide.
Optimazing votre script pourrait commencer avec
Utilisation de l'extension de sauvegarde de files xlsb
searchz un formatting non obligatoire en supprimant des lignes et des colonnes inutilisées et en sauvegardant afin de faire défiler la barre de défilement verticale et horizontale uniquement aux données nécessaires
Cela pourrait être ajouté à votre script
Au début du module principal d'où vous appelez d'autres modules ou fonctions
With Application .DisplayAlerts = False .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With
À la fin du module principal, la tâche est terminée
With Application .DisplayAlerts = True .ScreenUpdating = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With
Comme vous manipulez plusieurs objects de feuille de calcul, c'est un process très efficace. Un changement d'algorithm pourrait améliorer le time nécessaire pour ce process. Peut-être que vous devriez publier le code entier afin de vous aider à continuer.
À votre santé,
Pascal