Impact de l’enregistrement automatique (AutoSave) sur les compléments et les macros
En savoir plus sur le fonctionnement d’AutoSave dans Excel, PowerPoint et Word et comment il peut affecter les compléments ou macros.
Vue d’ensemble d’AutoSave
Lorsqu’un fichier est hébergé dans le cloud (autrement dit, OneDrive, OneDrive Entreprise ou SharePoint Online), AutoSave permet aux modifications de l’utilisateur d’être enregistrées de façon automatique et régulière. Lorsque le fichier est partagé avec d’autres personnes, leurs modifications sont fusionnées dans la version du fichier de cet utilisateur. Si AutoSave est désactivé, l’enregistrement doit être déclenché manuellement pour que les modifications de l’utilisateur soient conservées dans le cloud et pour que cet utilisateur reçoive les modifications des autres personnes.
Pour l’instant, Excel, Word et PowerPoint fournissent un événementBeforeSave qui permet au développeur d’exécuter du code une fois que l’utilisateur déclenche l’enregistrer mais avant que l’enregistrement ne commence. Excel propose également un événement AfterSavequi peut exécuter le code macro ou de complément une fois l’enregistrement terminé.
Lorsque AutoSave est activé, ces événements se déclenchent automatiquement et régulièrement sans intervention de l’utilisateur. Pour cette raison, les compléments et macros qui utilisent ces événements peuvent rencontrer des problèmes lorsque l’enregistrement automatique est activé.
En règle générale, ces problèmes peuvent être évités si l’utilisateur choisit de désactiver AutoSave. Vous pouvez le faire en tant qu’utilisateur à l’aide de la propriétéAutoSaveOn dans Word, Excel, et PowerPoint si cela est disponible (voir l’exemple suivant). Vous pouvez également prendre des mesures en tant que développeur pour atténuer ces problèmes afin que vos compléments et macros fonctionnent de manière plus efficace, même si AutoSave est activé.
Exemple
Cet exemple désactive AutoSave et informe l’utilisateur que le classeur n’est pas automatiquement enregistré.
Sub UseAutoSaveOn()
ActiveWorkbook.AutoSaveOn = False
MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub
Problèmes éventuels avec les événements d’enregistrement et AutoSave
Vous devrez gérer un ou plusieurs des problèmes concernant l’interaction entre les événements d’enregistrement et AutoSave :
- Le code dans les événementsBeforeSave ou AfterSave met trop de temps à s’exécuter
- Le code dans les événements d’enregistrement affiche une boîte de dialogue modale
- Le code dans les événements d’enregistrement efface la pile d’annulation (Excel uniquement)
- Le code dans AfterSave corrompt le classeur (Excel uniquement)
- Le code dans BeforeSave annule le fichier Enregistrer (en définissant l’argument Annuler sur True)
Problème 1 : le code dans les événements BeforeSave ou AfterSave met trop de temps à s’exécuter
En règle générale, Word, Excel et PowerPoint ne sont pas réactifs aux interactions utilisateur lors de l’exécution du code de complément ou de macro. Par conséquent, si votre code dans un gestionnaire d'événementsBeforeSave ou AfterSavemet beaucoup de temps à exécuter, cela peut dégrader considérablement l’expérience utilisateur.
Lorsque AutoSave est désactivé, ce code s’exécute uniquement lorsque l’utilisateur choisit explicitement d’enregistrer, aucun délai n’est donc visible, et peut être évité par l’utilisateur jusqu'à ce qu’il soit prêt à enregistrer.
Lorsque AutoSave est activé, ce code s’exécute automatiquement et régulièrement, ce qui a le potentiel d’interrompre l’utilisateur, en particulier si le code met beaucoup de temps à s’exécuter.
Exemple de scénario
Imaginez un complément qui permet à l’utilisateur de créer des mappages personnalisés basés sur les données dans un classeur Excel. Ce type un complément peut disposer d’un code BeforeSave qui sérialise les cartes que l’utilisateur a créées et les stocke dans le classeur dans un composant CustomXML. Ce processus peut prendre une seconde pour s’exécuter, et Excel peut cesser de répondre lorsque cela se passe.
Lorsque AutoSave est désactivé, l’utilisateur choisit quand il souhaite enregistrer, et par conséquent, même si le complément ralentit légèrement l’enregistrement, l’utilisateur ne le remarque pas.
Lorsque AutoSave est activé, ce code BeforeSave s’exécute automatiquement et régulièrement même si l’utilisateur est au milieu d’une autre tâche (par exemple, saisie de données dans une cellule), ce qui peut être très ennuyeux.
Solution de contournement
Les compléments doivent essayer d’éviter les opérations qui mettent du temps à s’exécuter dans un événement d’enregistrement. Dans cet exemple, le développeur peut décider de conserver les mappages personnalisés vers le fichier lorsqu’ils sont créés ou modifiés par l’utilisateur, plutôt que d’attendre l’événement d’enregistrement.
Problème 2 : le code dans les événements d’enregistrement affiche une boîte de dialogue modale
N’importe quel code exécuté dans un événement d’enregistrement qui affiche l’interface utilisateur comme une boîte de dialogue modal a le potentiel de sérieusement dégrader l’expérience utilisateur lorsque l’enregistrement automatique est activé. Étant donné que les événementsBeforeSave et AfterSave s’exécutent automatiquement et régulièrement, ces boîtes de dialogue peuvent interrompre le flux de travail normal de l’utilisateur.
Exemple de scénario
Un complément qui valide un document Word avant d’enregistrer pour garantir que la marque de la société soit appliquée peut démarrer une boîte de dialogue qui avertit l’utilisateur des problèmes détectés et offre un moyen approprié pour les corriger. Étant donné que l’événement BeforeSave se déclenche désormais automatiquement et en continu, cette boîte de dialogue de validation peut apparaître soudainement alors que l’utilisateur fait quelque chose d’autre.
Solutions de contournement
Vous pouvez supprimer n’importe quel code qui doit afficher l’interface utilisateur aux autres zones de l’application. Par exemple, l’utilisateur peut sélectionner un bouton « Valider » pour déclencher le processus de validation, ou vous pouvez démarrer le code de validation uniquement si l’utilisateur tente de modifier des données existantes.
Si vous souhaitez que le code de validation ne se déclenche que lors du premier enregistrement à partir d’un nouveau document, mais pas sur les sauvegardes automatiques suivantes, vous pouvez inspecter une propriété comme Workbook.Path d’Excel avant d’afficher l’interface utilisateur pendant BeforeSave ou AfterSave. Dans Excel, la propriété Workbook.Path doit être vide si le classeur n’a pas encore d’emplacement de sauvegarde.
Problème 3 : le code dans les événements d’enregistrement efface la pile d’annulation (Excel uniquement)
En règle générale, si vous exécutez certaines instructions VBA dans Excel, la pile d’annulation sera effacée. Par exemple, si vous modifiez la valeur d’une cellule en exécutant ActiveCell.Value = "myValue"
, la pile d’annulation est effacée. Si ce type de code est présent dans l’événement BeforeSave ou AfterSave pour une macro ou complément et que AutoSave est activé, un utilisateur de cette macro ou complément ne pourra sûrement pas annuler les actions normales de l’utilisateur comme prévu.
Exemple de scénario
Il est possible qu’un complément puisse avoir du code qui s’exécute en réponse à l’événement BeforeSave qui recherche dans le document et écrit des valeurs dans un tableau « journal » dans le classeur. Lorsque AutoSave est activé, cela effacerait régulièrement la pile d’annulation, ce qui peut potentiellement ennuyer les utilisateurs.
Solution de contournement
Pensez à supprimer du code qui écrit dans le classeur dans les événementsBeforeSave ou AfterSave. Par exemple, le complément décrit dans le scénario exemple peut être modifié pour stocker le journal des modifications dans un fichier distinct ou une base de données.
Problème 4 : le code dansAfterSave corrompt le classeur (Excel uniquement)
Lorsque AutoSave est activé, les événementsBeforeSave et AfterSave se déclenchent uniquement s’il y a eu une modification dans le classeur depuis leur dernier déclenchement. Si le code dans l’événement AfterSave corrompt le classeur (autrement dit, effectue des modifications supplémentaires), cela peut déclencher de nouveau les événements pour les mêmes modifications, puis mettre les événements en file d’attente indéfiniment. Cela peut gaspiller les ressources système et affecter la charge de la batterie.
Solution de contournement
Le code qui corrompt le classeur dans AfterSave doit être déplacé vers BeforeSave ou vers un tout autre emplacement (voir problème 3). Ce n’est pas recommandé aujourd'hui, même sans AutoSave, car cela laisse le classeur dans un état « modifié » perpétuel, ce qui entraîne une invite qui s’affiche lors de la fermeture qui demande à l’utilisateur d’enregistrer leurs modifications même si aucune modification supplémentaire n’a été effectuée.
Problème 5 : Le code dans BeforeSave annule le fichier Enregistrer (en définissant l’argument Annuler sur True)
Aujourd'hui, il est possible d’annuler l’enregistrement dans l’événement BeforeSave en définissant Cancel
sur True :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
End Sub
Lorsque AutoSave est activé, l’application (autrement dit, Excel, Word ou PowerPoint) déclenche les enregistrements automatiquement en continu jusqu'à ce que le fichier ne comporte plus de modifications non enregistrées. Une fois que l’utilisateur a apporté une modification unique au fichier, l’application tente de l’enregistrer.
Si le développeur choisit d’annuler l’enregistrement de la manière décrite précédemment, l’application détermine continuellement qu’il y a des modifications non enregistrées, ce qui entraîne une nouvelle tentative d’enregistrement. Étant donné que le même code d’événement qui annulé le premier enregistrement annulera également cette seconde tentative d’enregistrement, le processus continuera tant que le fichier est ouvert, et dégradera éventuellement les performances et la vie de la batterie.
Exemple de scénario
Un complément peut remplacer complètement le code d’enregistrement par défaut Word afin que le fichier soit enregistré dans une base de données d’entreprise à la place de sur un disque ou un emplacement SharePoint. Ce type de complément annulerait tout d’abord la tentative d’enregistrement avant d’essayer de l’enregistrer à un autre endroit.
Solution de contournement
Ces compléments devraient s’assurer que AutoSave est désactivé en définissant AutoSaveOn sur False. Comme un fichier doit déjà être enregistré dans un emplacement OneDrive ou SharePoint pour que AutoSave soit activé, AutoSave devrait déjà être désactivé dans la plupart des versions de ce scénario.
Voir aussi
- La co-création dans Excel
- Objet Document
- Objet Présentation
- Objet Classeur
- AfterSave événement dans Excel
- BeforeSave événement dans Excel
- BeforeSave événement dans PowerPoint
- BeforeSave événement dans Word
Assistance et commentaires
Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.