Vous l'avez certainement remarquée si vous utilisez Excel 2016 et les suivants: la petite icône de l'Enregistrement automatique dans Excel… Une petite fonctionnalité bien pratique pour l'utilisateur mais qui peut avoir un impact sur l'exécution des macros en VBA!
Sommaire
Enregistrement automatique dans Excel: comment ça marche?
Cette fonctionnalité fonctionne de la manière suivante – pour autant que le Classeur soit stocké sur OneDrive ou sur SharePoint, les changements que vous faites au Classeur sont enregistrés au fur et à mesure. Il ne s'agit pas d'une "sauvegarde automatique classique". Ici, Excel enregistre CHAQUE changement que vous faites dans votre Classeur:
- changement des valeurs dans les cellules
- changements des formats
- ajouts de Feuilles
- etc.
Chacune de ces actions déclenche un enregistrement. On peut donc dire qu'Excel est en train d'enregistrer presque non-stop.
Impact de "l'Enregistrement automatique" sur une macro VBA
Comme vous pouvez donc imaginer, ce comportement peut avoir un important impact sur les macros VBA:
- la performance (dépends de la vitesse du réseau qui doit gérer tous ces enregistrements)
- les conflits avec d'autres utilisateurs qui travaillent potentiellement dans le même Classeur
- si vous testez votre macro ou si la macro contient un problème, vous risquez de perdre votre travail (ou causer les problèmes à l'utilisateur qui a lancé la macro)
- …
Bref, la liste des problèmes potentiels est longue comme un bras… Vous pouvez voir ce qu'en dit Microsoft lui-même (que cela ne vous empêche pas de dormir!).
VBA: tester si la sauvegarde automatique est activée ou pas
On ne va pas se le cacher – lors de lancement d'une macro, il vaut mieux vérifier si la sauvegarde automatique est activée et si oui, la désactiver. Pour cela, nous allons utiliser la propriété VBA Workbook.AutoSaveOn
. Il s'agit d'une propriété de type Booléen (Boolean
) qui nous retourne la valeur VRAI ou FAUX (True
ou False
) et que nous pouvons modifier.
Nous pouvons donc facilement tester si la sauvegarde automatique Excel est activée ou pas…
1 2 3 4 5 6 7 8 9 10 |
Sub TestEnregistrementAutomatique() 'par Excel-Malin.com ( https://excel-malin.com ) If ThisWorkbook.AutoSaveOn = True Then MsgBox "L'enregistrement automatique est activé" Else MsgBox "L'enregistrement automatique est désactivé" End If End Sub |
De cette manière, vous savez où vous en êtes.
Désactiver l'enregistrement automatique (temporairement)
Pour désactiver cette fonctionnalité, il suffit d'utiliser:
1 |
ThisWorkbook.AutoSaveOn = False |
Ainsi, vous pouvez exécuter votre code sans se soucier de l'AutoSave.
On pourrait s'arrêter là. Mais nous pouvons améliorer ce code.
Principalement pour deux raisons…
Vérifier la version d'Excel pour éviter les erreurs
Utiliser la propriété .AutoSaveOn
dans une version d'Excel antérieure à Excel 2016 va déclencher une erreur (par exemple si vous voulez activer le AutoSave). Il vaut donc mieux de limiter l'utilisation de notre code aux versions Excel les plus récentes. Nous allons donc d'abord tester la version d'Office sur laquelle la macro a été exécutée. Dans ce cas-ci, il faut qu'il s'agisse de la version "16" et les (potentielles) suivantes.
Voici donc le code qui tient compte de cette contrainte:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub TestEnregistrementAutomatique_2() 'par Excel-Malin.com ( https://excel-malin.com ) If Val(Application.Version) > 15 Then If ThisWorkbook.AutoSaveOn = True Then MsgBox "L'enregistrement automatique est activé" Else MsgBox "L'enregistrement automatique est désactivé" End If Else End If End Sub |
Rendre le Classeur à l'utilisateur dans les mêmes conditions
L'expérience m'a appris que les utilisateurs apprécient assez peu que l'on modifie la configuration de leur PC ou de leur application à leur insu. C'est pour cela que je préfère que la macro "restitue" le Classeur dans le même état dans lequel il se trouvait avant le lancement de la macro (que ce soit pour la résolution de l'écran, le zoom, les dossiers par défaut etc.).
Pour cela, il suffit d'ajouter une variable qui contiendra l'état de l'AutoSave avant le début de la macro. Cela permettra ensuite de le remettre dans le même état qu'au départ.
Voici donc le code final:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub TestEnregistrementAutomatique_final() 'par Excel-Malin.com ( https://excel-malin.com ) Dim EtatAutoSave As Boolean If Val(Application.Version) > 15 Then EtatAutoSave = ThisWorkbook.AutoSaveOn 'état de départ ThisWorkbook.AutoSaveOn = False '... votre code ... ThisWorkbook.AutoSaveOn = EtatAutoSave 'remise dans l'état de départ Else End If End Sub |
Avec ce code, vous devriez éviter les problèmes liés à l'Enregistrement automatique d'Excel.
Une dernière remarque pour la fin
Attention si le Classeur que vous testez ne se trouve pas sur un OneDrive ou sur un SharePoint. Si vous souhaitez activer l'AutoSave dans un Classeur qui est sauvegardé sur un disque local, vous allez déclencher une erreur.
Ceci arrive si vous utilisez ThisWorkbook.AutoSaveOn = True
de manière isolée. Avec le code que je vous propose plus haut, cela ne va pas arriver car si le fichier est en local, l'AutoSave est d'office False
. Et le code ne va pas l'activer. Vous êtes alors couverts!
Pour aller plus loin en VBA
Si vous avez trouvé cet article intéressant, je vous en propose d'autres qui pourraient rendre votre travail en VBA plus efficient et plus agréable…
- Liste de toutes les fonctions VBA
- Liste des événements (Events) disponibles en VBA
- Comment utiliser RECHERCHEV en VBA (tutoriel)
- Gestion des fichiers en VBA
- Débloquer VBA dans les fichiers venant d'Internet