Excel VBA AutoFit s'exécute lentement

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

  • Utilisez la gamme nommée autant que possible

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

http://multiskillz.tekcities.com