10 façons daccélérer vos macros

Au fur et à mesure que vos macros Excel deviennent de plus en plus robustes et complexes, vous constaterez peut-être qu'elles perdent en performances. Lorsqu'on parle de macros, le mot performance est généralement synonyme de vitesse . La vitesse est la rapidité avec laquelle vos procédures VBA effectuent les tâches prévues. Voici dix façons de vous aider à maintenir vos macros Excel à leur niveau de performance optimal.

Arrêter les calculs de feuille

Saviez-vous qu'à chaque fois qu'une cellule qui affecte une formule de votre feuille de calcul est modifiée ou manipulée, Excel recalcule l'intégralité de la feuille de calcul ? Dans les feuilles de calcul contenant une grande quantité de formules, ce comportement peut considérablement ralentir vos macros.

Vous pouvez utiliser la propriété Application.Calculation pour indiquer à Excel de passer en mode de calcul manuel. Lorsqu'un classeur est en mode de calcul manuel, le classeur ne sera pas recalculé tant que vous n'aurez pas explicitement déclenché un calcul en appuyant sur la touche F9.

Placez Excel en mode de calcul manuel, exécutez votre code, puis revenez en mode de calcul automatique.

Sous-Macro1()
Application.Calculation = xlCalculationManual
 'Placez votre code de macro ici
Application.Calculation = xlCalculationAutomatique
Fin du sous-marin

Redéfinir le mode de calcul sur xlCalculationAutomatic déclenchera automatiquement un recalcul de la feuille de calcul, il n'est donc pas nécessaire d'appuyer sur la touche F9 après l'exécution de votre macro.

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

Vous remarquerez peut-être que lorsque vos macros s'exécutent, votre écran clignote beaucoup. Ce scintillement est qu'Excel essaie de redessiner l'écran pour afficher l'état actuel de la feuille de calcul. Malheureusement, chaque fois qu'Excel redessine l'écran, cela consomme des ressources mémoire.

Vous pouvez utiliser la propriété Application.ScreenUpdating pour désactiver les mises à jour d'écran jusqu'à ce que votre macro soit terminée. La désactivation de la mise à jour de l'écran permet d'économiser du temps et des ressources, permettant à votre macro de s'exécuter un peu plus rapidement. Une fois l'exécution de votre code de macro terminée, vous pouvez réactiver la mise à jour de l'écran.

Sous-Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Faux
 'Placez votre code de macro ici
Application.Calculation = xlCalculationAutomatique
Application.ScreenUpdating = True
Fin du sous-marin

Après avoir redéfini la propriété ScreenUpdating sur True, Excel déclenchera automatiquement un rafraîchissement de l'écran.

Désactiver les mises à jour de la barre d'état

La barre d'état Excel, qui apparaît en bas de la fenêtre Excel, affiche normalement la progression de certaines actions dans Excel. Si votre macro fonctionne avec beaucoup de données, la barre d'état utilisera des ressources.

Il est important de noter que la désactivation de la mise à jour de l'écran est distincte de la désactivation de l'affichage de la barre d'état. La barre d'état continuera à être mise à jour même si vous désactivez la mise à jour de l'écran. Vous pouvez utiliser la propriété Application.DisplayStatusBar pour désactiver temporairement toutes les mises à jour de la barre d'état, améliorant encore les performances de votre macro :

Sous-Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Faux
Application.DisplayStatusBar = Faux
 'Placez votre code de macro ici
Application.Calculation = xlCalculationAutomatique
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Fin du sous-marin

Dire à Excel d'ignorer les événements

Vous pouvez implémenter des macros en tant que procédures événementielles, indiquant à Excel d'exécuter un certain code lorsqu'une feuille de calcul ou un classeur change.

Parfois, les macros standard apportent des modifications qui déclencheront une procédure événementielle. Par exemple, si vous avez une macro standard qui manipule plusieurs cellules sur Sheet1, chaque fois qu'une cellule de cette feuille est modifiée, votre macro doit s'interrompre pendant que l'événement Worksheet_Change s'exécute.

Vous pouvez ajouter un autre niveau d'amélioration des performances en utilisant la propriété EnableEvents pour indiquer à Excel d'ignorer les événements pendant l'exécution de votre macro.

Définissez la propriété EnableEvents sur False avant d'exécuter votre macro. Une fois l'exécution de votre code de macro terminée, vous pouvez redéfinir la propriété EnableEvents sur True.

Sous-Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Faux
Application.DisplayStatusBar = Faux
Application.EnableEvents = False
 'Placez votre code de macro ici
Application.Calculation = xlCalculationAutomatique
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Fin du sous-marin

Masquer les sauts de page

Chaque fois que votre macro modifie le nombre de lignes, modifie le nombre de colonnes ou modifie la mise en page d'une feuille de calcul, Excel est obligé de prendre du temps pour recalculer les sauts de page affichés sur la feuille.

Vous pouvez éviter ce comportement en masquant simplement les sauts de page avant de démarrer votre macro.

Définissez la propriété de feuille DisplayPageBreaks sur False pour masquer les sauts de page. Si vous souhaitez continuer à afficher les sauts de page après l'exécution de votre macro, redéfinissez la propriété de feuille DisplayPageBreaks sur True.

Sous-Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Faux
Application.DisplayStatusBar = Faux
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Placez votre code de macro ici
Application.Calculation = xlCalculationAutomatique
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
Fin du sous-marin

Suspension des mises à jour du tableau croisé dynamique

Si votre macro manipule des tableaux croisés dynamiques qui contiennent des sources de données volumineuses, vous pouvez rencontrer des performances médiocres lorsque vous effectuez des opérations telles que l'ajout ou le déplacement dynamique de champs croisés dynamiques.

You can improve the performance of your macro by suspending the recalculation of the pivot table until all pivot field changes have been made. Simply set the PivotTable.ManualUpdate property to True to defer recalculation, run your macro code, and then set the PivotTable.ManualUpdate property back to False to trigger the recalculation.

Sub Macro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Place your macro code here
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
End Sub

Steering clear of copy and paste

It’s important to remember that although Macro Recorder saves time by writing VBA code for you, it does not always write the most efficient code. A prime example is how Macro Recorder captures any copy-and-paste action you perform while recording.

You can give your macros a slight boost by cutting out the middleman and performing a direct copy from one cell to a destination cell. This alternate code uses the Destination argument to bypass the clipboard and copy the contents of cell A1 directly to cell B1.

Range("A1").Copy Destination:=Range("B1")

If you need to copy only values (not formatting or formulas), you can improve performance even more by avoiding the Copy method all together. Simply set the value of the destination cell to the same value found in the source cell. This method is about approximately 25 times faster than using the Copy method:

Range("B1").Value = Range("A1").Value

Si vous devez copier uniquement des formules d'une cellule à une autre (pas de valeurs ni de mise en forme), vous pouvez définir la formule de la cellule de destination sur la même formule que celle contenue dans la cellule source :

Plage("B1").Formule = Plage("A1").Formule

Utilisation de l'instruction With

Lors de l'enregistrement de macros, vous manipulerez souvent le même objet plus d'une fois. Vous pouvez gagner du temps et améliorer les performances en utilisant l'instruction With pour effectuer plusieurs actions sur un objet donné en une seule fois.

L'instruction With utilisée dans l'exemple suivant indique à Excel d'appliquer toutes les modifications de mise en forme en même temps :

    Avec plage ("A1"). Police
    .Bold = Vrai
    .Italique = Vrai
    .Underline = xlUnderlineStyleSingle
    Terminer par

Prendre l'habitude de segmenter des actions dans des instructions With permettra non seulement d'accélérer l'exécution de vos macros, mais facilitera également la lecture de votre code de macro.

Éviter la méthode Select

Macro Recorder aime utiliser la méthode Select pour sélectionner explicitement des objets avant de prendre des mesures sur eux. Il n'est généralement pas nécessaire de sélectionner des objets avant de travailler avec eux. En fait, vous pouvez considérablement améliorer les performances des macros en n'utilisant pas la méthode Select.

Après avoir enregistré vos macros, prenez l'habitude de modifier le code généré pour supprimer les méthodes Select. Dans ce cas, le code optimisé ressemblerait à ce qui suit :

    Feuilles("Feuille1").Plage("A1").FormuleR1C1 = "1000"
    Feuilles("Feuille2").Plage("A1").FormuleR1C1 = "1000"
    Feuilles("Feuille3").Plage("A1").FormuleR1C1 = "1000"

Notez que rien n'est sélectionné. Le code utilise simplement la hiérarchie des objets pour appliquer les actions nécessaires.

Limiter les déplacements à la feuille de calcul

Une autre façon d'accélérer vos macros consiste à limiter le nombre de fois où vous référencez des données de feuille de calcul dans votre code. Il est toujours moins efficace de récupérer les données de la feuille de calcul que de la mémoire. C'est-à-dire que vos macros s'exécuteront beaucoup plus rapidement si elles n'ont pas à interagir à plusieurs reprises avec la feuille de calcul.

Par exemple, le code simple suivant force VBA à revenir en permanence à Sheets ("Sheet1").Range ("A1") pour obtenir le nombre nécessaire à la comparaison effectuée dans l'instruction If :

Pour ReportMonth = 1 à 12
     If Range("A1").Value = ReportMonth Then
     MsgBox 1000000 / ReportMonth
Fin si
Mois du rapport suivant

Une méthode beaucoup plus efficace consiste à enregistrer la valeur dans Sheets ("Sheet1").Range ("A1") dans une variable appelée MyMonth. De cette façon, le code référence la variable MyMonth au lieu de la feuille de calcul :

Dim MyMonth en tant qu'entier
MonMois = Plage("A1").Valeur
Pour ReportMonth = 1 à 12
Si MyMonth = ReportMonth Then
MsgBox 1000000 / ReportMonth
Fin si
Mois du rapport suivant

Envisagez de tirer parti des variables pour travailler avec des données en mémoire plutôt que de référencer directement des feuilles de calcul.

Évitez les références excessives

Lors de l'appel d'une méthode ou d'une propriété d'un objet, celle-ci doit passer par l'interface IDispatch du composant OLE. Les appels à ces composants OLE prennent du temps, donc réduire le nombre de références aux composants OLE peut améliorer la vitesse du code de macro.

Pour l'invocation de propriétés ou de méthodes d'objet, la méthode de représentation de  Object.Method  est généralement utilisée, c'est-à-dire le "." Le symbole est utilisé pour appeler des propriétés et des méthodes.

Par conséquent, le nombre d'appels de méthode ou de propriété peut être jugé en fonction du nombre de symboles ".". Moins il y a de "." symbole, plus le code s'exécute rapidement.

Par exemple, l'instruction suivante comprend 3 symboles ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

L'instruction suivante n'a qu'un seul symbole ".".

Activewindow.Top = 100

Voici quelques astuces pour réduire le nombre de symboles "." pour courir plus vite.

Premièrement, lorsque vous devez faire référence au même objet à plusieurs reprises, vous pouvez définir l'objet sur une variable pour réduire le nombre d'appels. Par exemple, le code suivant nécessite deux appels par ligne.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Étant donné que l'  objet Sheets("Sheet1")  doit être référencé à plusieurs reprises, il peut d'abord être défini sur une variable  sht  , de sorte que chaque code ne doit être appelé qu'une seule fois.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

Deuxièmement, si vous ne souhaitez pas déclarer de variable temporaire sht, vous pouvez également utiliser l'  instruction With  mentionnée précédemment. Comme le montre l'exemple suivant :

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

Troisièmement,  lorsqu'il y a beaucoup de boucles, essayez de conserver les propriétés et les méthodes en dehors de la boucle.  Lorsque vous réutilisez une valeur de propriété du même objet dans une boucle, vous pouvez d'abord attribuer la valeur de propriété à une variable spécifiée en dehors de la boucle, puis utiliser la variable dans la boucle, ce qui peut atteindre une vitesse plus rapide. Comme le montre l'exemple suivant :

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Chaque boucle de cet exemple obtient la propriété Value de la cellule Cells(1,2). Si vous attribuez la propriété Value de Cells(1.2) à une variable avant le début de la boucle, vous obtiendrez une exécution plus rapide. Comme le montre l'exemple suivant :

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

Le code ci-dessus appelle  ThisWorkbook.Sheets("Sheet1")  à chaque boucle. Vous pouvez le faire plus rapidement en utilisant l'  instruction With  pour déplacer l'appel vers  ThisWorkbook.Sheets("Sheet1")  en dehors de la boucle. Comme le montre l'exemple suivant :

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Évitez d'utiliser des types de variantes

Les débutants préfèrent généralement utiliser des variables de type Variant, ce qui a l'avantage d'être moins compliqué car n'importe quel type de données peut être utilisé sans problème de débordement de mémoire si les données sont trop volumineuses pour les types de données Integer ou Long. Cependant, les données de type Varienmt nécessitent plus d'espace mémoire supplémentaire que les autres types spécifiés (2 octets pour les données entières, 4 octets pour les données longues et 16 octets pour les données Variant). VBA nécessite plus de temps pour traiter les données de type Variant que les autres types spécifiés. de données. Comme le montre l’exemple suivant.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

Dans le code ci-dessus, les lignes 8 à 13 effectuent 1 million d'opérations d'addition, de soustraction, de multiplication et de division de variables Variantes, et les lignes 17 à 22 effectuent 1 million d'opérations d'addition, de soustraction, de multiplication et de division de variables entières. Sur mon ordinateur, l'opération de la variable Variant a pris environ  0,09375  seconde, tandis que l'opération de la variable Integer a pris environ  0,03125  seconde. Les résultats peuvent varier d'un ordinateur à l'autre, mais  les variables Variant sont nettement plus lentes que les variables Integer .

Pour cette raison,  il est recommandé d'éviter d'utiliser des variables Variant lorsque vous pouvez utiliser explicitement le type de données spécifié .


Feuille intelligente 9.1.1

Feuille intelligente 9.1.1

Smartsheet est une plateforme de travail dynamique qui vous permet de gérer des projets, de créer des flux de travail et de collaborer avec votre équipe.

SharePoint

SharePoint

SharePoint est un système de collaboration basé sur le Web qui utilise une variété d'applications de flux de travail, des bases de données de « liste » et d'autres composants Web, ainsi que des fonctionnalités de sécurité pour donner le contrôle aux groupes professionnels qui travaillent ensemble.

Calendrier perpétuel 1.0.38/1.0.36

Calendrier perpétuel 1.0.38/1.0.36

Van Nien Calendar est une application d'affichage de calendrier sur votre téléphone, vous aidant à voir rapidement la date luni-solaire sur votre téléphone, organisant ainsi votre travail important.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook est une application commerciale et de productivité développée par Microsoft Corporation.

Cliquez vers le haut

Cliquez vers le haut

ClickUp est l'une des plateformes de productivité les mieux notées pour toutes les entreprises. Les grandes entreprises comme Google, Booking.com, San Diego Padres et Uber utilisent toutes ClickUp pour augmenter la productivité sur le lieu de travail.

Visionneuse PDF-XChange 2.5.322.10

Visionneuse PDF-XChange 2.5.322.10

Le PDF est devenu un format couramment utilisé pour lire, créer et envoyer des documents texte. À son tour, le nombre de programmes utilisés pour ce type de documentation a augmenté. PDF-XChange Viewer fait partie d'un nombre croissant de visualiseurs PDF.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice propose une suite complète d'applications Office qui rivalisent avec Microsoft 365, notamment dans Excel, PowerPoint et Word. Il vous permet de gérer vos projets plus efficacement et prend en charge plusieurs formats de fichiers.

Télécharger iTaxviewer 1.8.7

Télécharger iTaxviewer 1.8.7

Le logiciel iTaxViewer est aujourd'hui le logiciel de lecture de fichiers XML le plus populaire. Ce logiciel est une application de lecture des déclarations fiscales électroniques au format XML de la Direction Générale des Impôts.

Lecteur PDF Nitro

Lecteur PDF Nitro

Nitro PDF Reader est un éditeur PDF pratique qui couvre toutes les tâches de base que la plupart des gens effectuent quotidiennement avec des documents PDF.

Lecteur Foxit 12

Lecteur Foxit 12

Foxit Reader est avant tout un lecteur PDF et vous permet également de créer des fichiers PDF, de les signer, de les modifier et d'ajouter des annotations. Il fonctionne sur les systèmes d'exploitation, il existe des plugins pour divers programmes du package Microsoft Office.