VBA : améliorez la vitesse et autres bonnes pratiques

Ce didacticiel expliquera comment accélérer les macros VBA et d'autres bonnes pratiques VBA.

Paramètres pour accélérer le code VBA

Vous trouverez ci-dessous plusieurs astuces pour accélérer votre code VBA. Les conseils sont vaguement organisés par importance.

Le moyen le plus simple d'améliorer la vitesse de votre code VBA consiste à désactiver ScreenUpdating et à désactiver les calculs automatiques. Ces paramètres doivent être désactivés dans toutes les grandes procédures.

Désactiver la mise à jour de l'écran

Par défaut, Excel affiche les modifications apportées au(x) classeur(s) en temps réel lors de l'exécution du code VBA. Cela provoque un ralentissement massif de la vitesse de traitement, car Excel interprète et affiche la plupart des modifications pour chaque ligne de code.

Pour désactiver la mise à jour de l'écran :

1 Application.ScreenUpdating = Faux

À la fin de votre macro, vous devez réactiver la mise à jour d'écran :

1 Application.ScreenUpdating = True

Pendant l'exécution de votre code, vous devrez peut-être « rafraîchir » l'écran. Il n'y a pas de commande "rafraîchir". Au lieu de cela, vous devrez réactiver la mise à jour de l'écran et la désactiver à nouveau.

Définir les calculs sur Manuel

Chaque fois qu'une valeur de cellule est modifiée, Excel doit suivre « l'arbre de calcul » pour recalculer toutes les cellules dépendantes. De plus, chaque fois qu'une formule est modifiée, Excel devra mettre à jour « l'arbre de calcul » en plus de recalculer toutes les cellules dépendantes. Selon la taille de votre classeur, ces recalculs peuvent ralentir l'exécution de vos macros.

Pour définir les calculs sur Manuel :

1 Application.Calcul = xlManuel

Pour recalculer manuellement l'intégralité du classeur :

1 Calculer

Notez que vous pouvez également calculer uniquement une feuille, une plage ou une cellule individuelle, si nécessaire pour une vitesse améliorée.

Pour restaurer les Calculs Automatiques (à la fin de votre procédure) :

1 Application.Calcul = xlAutomatique

Important! Il s'agit d'un paramètre Excel. Si vous ne redéfinissez pas les calculs sur automatique, votre classeur ne sera pas recalculé tant que vous ne le lui aurez pas demandé.

Vous constaterez les plus grandes améliorations par rapport aux paramètres ci-dessus, mais plusieurs autres paramètres peuvent faire la différence :

Désactiver les événements

Les événements sont des « déclencheurs » qui provoquent des procédures événementielles courir. Les exemples incluent : lorsqu'une cellule d'une feuille de calcul change, lorsqu'une feuille de calcul est activée, lorsqu'un classeur est ouvert, avant qu'un classeur ne soit enregistré, etc.

La désactivation des événements peut entraîner des améliorations de vitesse mineures lors de l'exécution de macros, mais l'amélioration de la vitesse peut être beaucoup plus importante si votre classeur utilise des événements. Et dans certains cas, la désactivation des événements est nécessaire pour éviter de créer des boucles sans fin.

Pour désactiver les événements :

1 Application.EnableEvents = False

Pour réactiver les événements :

1 Application.EnableEvents = True

Désactiver les sauts de page

La désactivation des sauts de page peut aider dans certaines situations :

  • Vous avez précédemment défini une propriété PageSetup pour la feuille de calcul appropriée et votre procédure VBA modifie les propriétés de plusieurs lignes ou colonnes
  • OU Votre procédure VBA oblige Excel à calculer les sauts de page (affichage de l'aperçu avant impression ou modification des propriétés de PageSetup).

Pour désactiver les sauts de page :

1 ActiveSheet.DisplayPageBreaks = False

Pour réactiver les sauts de page :

1 ActiveSheet.DisplayPageBreaks = True

Meilleures pratiques pour améliorer la vitesse de VBA

Évitez d'activer et de sélectionner

Lorsque vous enregistrez une macro, vous verrez de nombreuses méthodes d'activation et de sélection :

12345678 Sub Slow_Example()Feuilles("Feuille2").SélectionnezPlage("D9").SélectionnezActiveCell.FormulaR1C1 = "exemple"Plage("D12").SélectionnerActiveCell.FormulaR1C1 = "démo"Plage("D13").SélectionnerFin du sous-marin

L'activation et la sélection d'objets sont généralement inutiles, ils ajoutent de l'encombrement à votre code et prennent beaucoup de temps. Vous devriez éviter ces méthodes dans la mesure du possible.

Exemple amélioré :

1234 Sous Fast_Example()Feuilles("Feuille2").Plage("D9").FormuleR1C1 = "exemple"Feuilles("Feuille2").Plage("D12").FormuleR1C1 = "démo"Fin du sous-marin

Évitez de copier et coller

La copie nécessite une mémoire importante. Malheureusement, vous ne pouvez pas dire à VBA d'effacer la mémoire interne. Au lieu de cela, Excel effacera sa mémoire interne à des intervalles (apparemment) spécifiques. Ainsi, si vous effectuez de nombreuses opérations de copier-coller, vous courez le risque d'accaparer trop de mémoire, ce qui peut considérablement ralentir votre code ou même faire planter Excel.

Au lieu de copier et coller, envisagez de définir les propriétés de valeur des cellules.

123456789 Sous CopierColler()'RalentissezPlage("a1:a1000").Copier la plage("b1:b1000")'Plus rapidePlage("b1:b1000").Valeur = Plage("a1:a1000").ValeurFin du sous-marin

Utilisez les boucles For Each au lieu des boucles For

Lorsque vous parcourez des objets, la boucle For Each est plus rapide que la boucle For. Exemple:

Cette boucle For :

123456 Sous-boucle1()dim i comme plagePour i = 1 à 100Cellules(i, 1).Valeur = 1Ensuite jeFin du sous-marin
Est plus lent que cela pour chaque boucle :
123456 Sous-boucle2()Cellule tamisée en tant que plagePour chaque cellule de la plage ("a1:a100")cellule.Valeur = 1Cellule suivanteFin du sous-marin

Déclarer les variables / Utiliser l'option explicite

VBA n'exige pas que vous déclariez vos variables, sauf si vous ajoutez Option Explicit en haut de votre module :
1 Option Explicite
L'ajout d'une option explicite est une bonne pratique de codage car elle diminue la probabilité d'erreurs. Cela vous oblige également à déclarer vos variables, ce qui augmente légèrement la vitesse de votre code (les avantages sont d'autant plus visibles qu'une variable est utilisée).Comment Option Explicit empêche-t-il les erreurs ?Le plus grand avantage d'Option Explicit est qu'il vous aidera à détecter les erreurs d'orthographe des noms de variables. Par exemple, dans l'exemple suivant, nous avons défini une variable nommée « var1 », mais plus tard, nous référençons la variable nommée « varl ». La variable « varl » n'a pas été définie, elle est donc vide, ce qui provoque des résultats inattendus.
1234 Sous-optionExplicit()var1 = 10varl MsgBoxFin du sous-marin

Utiliser avec - Terminer par les instructions

Si vous référencez plusieurs fois les mêmes objets (par exemple, plages, feuilles de calcul, classeurs), envisagez d'utiliser l'instruction With. Il est plus rapide à traiter, peut rendre votre code plus facile à lire et simplifie votre code.Avec exemple de déclaration :
12345678 Sub Faster_Example()Avec des feuilles("Feuille2").Range("D9").FormuleR1C1 = "exemple".Range("D12").FormuleR1C1 = "démo".Range("D9").Font.Bold = True.Range("D12").Font.Bold = TrueTerminer parFin du sous-marin
Est plus rapide que :
123456 Sub Slow_Example()Feuilles("Feuille2").Plage("D9").FormuleR1C1 = "exemple"Feuilles("Feuille2").Plage("D12").FormuleR1C1 = "démo"Sheets("Sheet2").Range("D9").Font.Bold = TrueSheets("Sheet2").Range("D12").Font.Bold = TrueFin du sous-marin

Conseils avancés sur les meilleures pratiques

Protéger l'interface utilisateur uniquement

Il est recommandé de protéger vos feuilles de calcul contre la modification de cellules non protégées afin d'empêcher l'utilisateur final (ou vous-même !) De corrompre accidentellement le classeur. Cependant, cela empêchera également la ou les feuilles de calcul d'autoriser VBA à apporter des modifications. Vous devez donc déprotéger et reprotéger les feuilles de calcul, ce qui prend beaucoup de temps lorsqu'il est effectué sur plusieurs feuilles.

12345 Sous UnProtectSheet()Sheets ("feuille1"). Déprotéger le "mot de passe"'Modifier la feuille1Sheets ("feuille1").Protéger le "mot de passe"Fin du sous-marin

Au lieu de cela, vous pouvez protéger les feuilles en définissant UserInterfaceOnly:=True. Cela permet à VBA d'apporter des modifications aux feuilles, tout en les protégeant de l'utilisateur.

1 Sheets("sheet1").Protect Password:="password", UserInterFaceOnly:=True

Important! UserInterFaceOnly est réinitialisé sur False à chaque ouverture du classeur. Donc, pour utiliser cette fonctionnalité géniale, vous devrez utiliser les événements Workbook_Open ou Auto_Open pour définir le paramètre à chaque ouverture du classeur.

Placez ce code dans le module Thisworkbook :

123456 Sous-classeur privé_Open()Dim ws As Feuille de calculPour chaque ws dans les feuilles de calculws.Protect Password:="password", UserInterFaceOnly:=TrueWS suivantFin du sous-marin

ou ce code dans n'importe quel module standard :

123456 Private Sub Auto_Open()Dim ws As Feuille de calculPour chaque ws dans les feuilles de calculws.Protect Password:="password", UserInterFaceOnly:=TrueWS suivantFin du sous-marin

Utiliser des tableaux pour modifier de grandes plages

Il peut être très long de manipuler de larges plages de cellules (par exemple 100 000+). Au lieu de parcourir des plages de cellules en manipulant chaque cellule, vous pouvez charger les cellules dans un tableau, traiter chaque élément du tableau, puis restituer le tableau dans leurs cellules d'origine. Le chargement des cellules dans des matrices pour la manipulation peut être beaucoup plus rapide.

1234567891011121314151617181920212223242526272829303132 Sous-LoopRange()Cellule tamisée en tant que plageDim tStart en tant que doubletDébut = MinuteriePour chaque cellule dans la plage ("A1:A100000")cellule.Valeur = cellule.Valeur * 100Cellule suivanteDebug.Print (Timer - tStart) & " secondes"Fin du sous-marinSous-tableau de boucle()Dim arr comme varianteÉlément faible en tant que varianteDim tStart en tant que doubletDébut = Minuteriearr = Plage("A1:A100000").ValeurPour chaque élément dans arrarticle = article * 100Prochain pointPlage("A1:A100000").Valeur = arrDebug.Print (Timer - tStart) & " secondes"Fin du sous-marin

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave