0
votes

Excel attend longtemps pour commencer à sauver le document

Lors de l'ouverture de ma feuille, je crée un fichier de sauvegarde du classeur en cours presque sans aucun délai.

Lorsque je ferme le fichier, une autre copie du classeur est créée également presque sans délai. P>

Lorsque vous enregistrez le fichier maître, Excel attend longtemps (parfois il faut plusieurs minutes) avant d'économiser. P>

Le fichier maître n'est pas grand, seulement 1,05 Mo. J'ai essayé des solutions de vitesse disponibles sur le net. Même essayé de réinstaller Excel. P>

Ceci est le codage. P>

Private Sub Workbook_Open()
  ... ' perform some actions like setting NewName and ext
  ActiveWorkbook.SaveCopyAs (NewName & " (backup)." & ext)
  ....
End Sub

Private Sub Workbook_Deactivate()
  ... ' perform some actions like setting NewName and ext
  ActiveWorkbook.SaveCopyAs (NewName & " (backup)." & ext)
  ....
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI Then Cancel = True 'Excel will close and handle saving itself.
  If ActiveWorkbook.Saved Then Cancel = True ' Cancel saving when no changes were made
  ...
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Application.DisplayAlerts = False  ' Make sure no close message pops up from the application
  ActiveWorkbook.Save
  Application.DisplayAlerts = True
  ActiveWorkbook.Saved = True
  .... ' Processing stuff amongst with resetting ScreenUpdating, EnableEvents and Calculation 
  Cancel = True ' Or it will fire twice for some reason
End Sub


1 commentaires

J'ai l'impression que Excel 365 est incroyablement lent sur VBA. Nous avons également récemment reçu le bureau 365 au travail et certains codes VBA qui prenaient une minute à faire prendre une heure avec le même code. Je l'ai localisé dans une certaine mesure pour être Application.Calculation, il est défini sur Automatic, alors il sera lent, a-t-il le manuel et basculer vers automatique lorsque le code se termine.


3 Réponses :


0
votes

L'événement Workbook_BeforeForesave chaque fois que le classeur actuel est enregistré. Lorsqu'il complète, le classeur est enregistré sauf s'il a été défini sur TRUE (à tout moment du sous-programme). Réglage Annuler = TRUE arrête le classeur d'être enregistré lorsque le sous-programme se termine.

Le problème est lorsque vous appelez la méthode de sauvegarde dans l'événement workbook_beforefore, il déclenche immédiatement le même événement, qui tente immédiatement Pour enregistrer à nouveau le classeur, puis déclenche à nouveau l'événement. Ceci est répété jusqu'à atteindre la limite du nombre de sous-routines imbriquées pouvant fonctionner simultanément.

Savecopyas enregistre une copie du classeur, qui ne déclenche pas l'événement Beforesave, il suffit donc d'économiser Une copie du classeur une fois rapidement.

Peut-être 2007 n'a pas permis cet appel récursif de l'événement de Workbook_BeforeSave ou qu'il avait une limite plus petite de sous-routines imbriquées.

Réglage Annuler TRUE n'arrête pas l'événement dans ses pistes, il arrête simplement d'exceler de sauver le classeur après la fin du sous-programme. Si votre intention est de ne pas gérer manuellement la sauvegarde quand il n'y a pas eu de modifications (détectées par Savasui = true), vous devriez peut-être seulement quitter le sous-point à ce point: xxx > Le sous-programme s'arrêtera ensuite sans appeler la méthode de sauvegarde, mais le classeur sera toujours enregistré lorsque le sous-finition, mettant fin à la boucle récursive.


8 commentaires

Merci pour l'explication claire et, par conséquent, j'ai vu que mes exemples n'étaient pas terminés, alors je l'ai corrigé. J'ai déjà eu des événementsSenAclablesd définis sur FALSE pour empêcher la boucle sans fin, mais cela n'a pas montré dans mon codage. Pardon.


Ouais ça fait toute une différence. Avez-vous été capable d'identifier exactement où la longue pause est-elle lorsque vous entrez dans le code?


Oui. Il contient en fait la commande Enregistrer. C'est comme si Excel ne peut pas détecter que le serveur répond ou quelque chose comme ça. Cela ne figure pas dans les exemples de codage, mais je dispose d'une boîte de message affichant juste après la commande Enregistrer. Sur l'annulation = TRUE ... Cela fonctionne en fait parfaitement sans sortie SUB. Je l'ai essayé avec une messagbox montrant directement après si SaveUi puis annuler = true. Il ne montre jamais quand je ferme Excel.


Et si vous désactivez tous les événements et enregistrez le fichier manuellement après avoir apporté des modifications, cela enregistre rapidement?


J'essayais juste. Ça ne fait aucune différence. Les copies savent plus rapidement que le fichier maître lui-même. Même si je laisse Excel faire tout le travail lui-même. C'est pourquoi je ne peux pas comprendre. Même lorsque je viens d'ouvrir et de fermer le classeur, les copies économisent beaucoup plus rapidement que le fichier maître.


Je veux dire si vous commencez entièrement tout votre code d'événement. Absolument aucun code ne fonctionne et que vous enregistrez votre fichier manuellement sans macros en cours d'exécution.


J'ai fait. J'ai renommé le sous-ci, donc il n'a plus feu. Le résultat est le même. Je ferme Excel et la copie est enregistrée plus rapidement que le fichier maître.


Laissez-nous Continuez cette discussion dans le chat .



0
votes

Vous pouvez tester si le fichier a déjà été enregistré avant de tirer l'événement de sauvegarde:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then Cancel = True 'Excel will close and handle saving itself.

    If ActiveWorkbook.Saved = False Then
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        ActiveWorkbook.Save
        Application.DisplayAlerts = True
        Application.EnableEvents = True
        'Debug.Print "Fired"
    End If
End Sub


2 commentaires

J'ai essayé comme suggéré, mais en vain. En outre, ce n'est pas le problème. Lorsque le fichier est enregistré, il faut beaucoup de temps à compléter, que cela puisse être enregistré ou non.


BTW, j'ai changé mon exemple de codage pour le refléter.



0
votes

Après des tests approfondis, je viens à cette conclusion: la différence entre enregistrer une copie ou le fichier maître est que lorsque le fichier maître est enregistré, les fichiers temporaires et les espèces (?) sont traités. Cela conduit à un délai supplémentaire avant d'enregistrer un fichier. C'est la seule raison pour laquelle je puisse trouver cela explique la différence de comportement entre enregistrer une copie ou un fichier maître.


0 commentaires