VBA Word prend son temps

VBA Word prend son temps - VB/VBA/VBS - Programmation

Marsh Posté le 18-01-2016 à 11:34:00    

Bonjour
Je suis amené à utiliser VBA sous Word pour insérer de nombreux objets shape dans des documents.
Sous Word 2003, il n'y a pas de problème. Par contre, sous Word 2010, le temps d'exécution des macros est si long que celles-ci sont en pratique inutilisables tellement l'attente est insupportable.
Voici un exemple :  

Code :
  1. Sub MesureDuree()
  2.     Dim i As Long, Boite As Shape, Debut As Date
  3.     Debut = Time
  4.     For i = 1 To 100
  5.         Set Boite = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 4 * i, 72.75, 4, 19.5)
  6.         Boite.Fill.ForeColor.RGB = RGB(2 * i, 2 * i, 2 * i)
  7.     Next i
  8.     MsgBox CStr((Time - Debut) * 24 * 3600) & " s"
  9. End Sub


J'ouvre un nouveau document sous Word 2010 et je colle la macro dans ThisDocument. L'exécution dure une cinquantaine de secondes.
Toujours sous Word 2010, si j'enregistre le nouveau document au format Word 2003 (extension .doc,  c.-à-d. en mode de compatibilité) avant de lancer la macro, elle s'exécute en moins d'une seconde.
 
Qu'est ce qui a changé entre les deux versions de Word pour avoir un tel ralentissement, et peut on l'éviter tout en laissant le document au format 2010 ? Pourquoi MicroSoft accepte-t-il de telles régressions ?
edit : je n'ai rien trouvé comme réponses sur Internet.
edit2 : correction d'un oubli dans la macro


Message édité par jpl38 le 18-01-2016 à 15:47:46
Reply

Marsh Posté le 18-01-2016 à 11:34:00   

Reply

Marsh Posté le 18-01-2016 à 13:18:29    

 
            Bonjour !
 
            Et si après le document au format 2003 tu relances la procédure sur le document au format 2010, est-ce aussi long ?
 

Reply

Marsh Posté le 18-01-2016 à 15:31:21    

Merci de me répondre.
Je ne suis pas certain de comprendre ce que tu me demandes de faire ; voici donc le mode opératoire que j'ai suivi :
1) Je crée un nouveau fichier, qui a l'extension .docx.
    Je copie la macro dans ThisDocument.
    Je la lance : durée 50 s.
2) J'enregistre le fichier au format .docm
3) Je l'enregistre ensuite au format .doc (mode de compatibilité).
    J'efface toutes les boites de texte.
    Je lance  la macro : c'est instantané.
4) J'ouvre ensuite le .docm (menu fichier récent) sans fermer le .doc.
    J'efface toutes les boites de texte.
    Je relance la macro : durée 50 s. Cela ne change rien.
 
J'ai aussi remarqué que durant l'exécution dans le fichier .docm, j'ai le message "Word ne répond plus" après avoir obtenu environ la moitié des boites. Cela dure peut être une dizaine de secondes, puis ça repart.
Cela signifie que Word effectue un gros travail en arrière plan, mais quel travail ?

Reply

Marsh Posté le 18-01-2016 à 15:51:26    

Par curiosité, j'ai fait tourner la macro sous Excel 2010, en remplaçant ActiveDocument par ActiveSheet.
L'exécution est immédiate, aussi rapide qu'en Word 2003.

Reply

Marsh Posté le 20-01-2016 à 10:47:11    

 
            Bon ben voir alors à la source chez Microsoft …
 

Reply

Marsh Posté le 20-01-2016 à 16:19:12    

Marc L a écrit :

 
            Bon ben voir alors à la source chez Microsoft …
 


Tu as un lien à me proposer ?

Reply

Marsh Posté le 20-01-2016 à 20:20:55    

 
            Non pas vraiment …
 
            Juste rechercher dans ses forums celui dédié à Office.
 

Reply

Marsh Posté le 21-01-2016 à 08:12:07    

Merci, je vais farfouiller, on ne sait jamais.

Reply

Marsh Posté le 13-02-2016 à 12:05:43    

Bonjour
Je n'ai toujours pas réglé mon problème.
Sur tes conseils, j'ai posé ma question sur le forum http://www.msofficeforums.com/microsoft-word/.
 
La personne qui m'a répondu pense que le problème provient soit d'un complément à Word, soit d'un programme tiers.
Je lance donc Word sans complément, cela ne change rien.
 
J'ai cru comprendre que chez lui l'exécution de la macro est très rapide.
J'ai donc fait exécuter la macro à quelques amis qui disposent d'Office 2010. Ils ont tous constaté le même ralentissement.
 
Seul progrès : si je cache la fenêtre de mon document (lignes 5. et 12.), le temps d'exécution est divisé par 5.  

Code :
  1. Sub MesureDuree()
  2.         Dim i As Long, Boite As Shape, Debut As Date
  3.         Debut = Time
  4.         ActiveDocument.Windows(1).Visible = False
  5.         For i = 1 To 100
  6.             Set Boite = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 4 * i, 72.75, 4, 19.5)
  7.             Boite.Fill.ForeColor.RGB = RGB(2 * i, 2 * i, 2 * i)
  8.         Next i
  9.         ActiveDocument.Windows(1).Visible = True
  10.         MsgBox CStr((Time - Debut) * 24 * 3600) & " s"
  11.     End Sub


Si quelqu'un a une idée, ou peut prendre le temps de faire tourner la macro,  je suis preneur.
 
Bon weekend.

Reply

Marsh Posté le 13-02-2016 à 12:26:01    

tu peux essayer avec

Code :
  1. Application.ScreenUpdating = False
  2. Application.ScreenUpdating = True

Reply

Marsh Posté le 13-02-2016 à 12:26:01   

Reply

Marsh Posté le 13-02-2016 à 13:16:33    

J'ai déjà essayé. Cela accélère légèrement les choses, mais rien de significatif.
J'ai fait d'autres tests. Avec 500 Textbox, le temps d'exécution passe de 108 secondes à 3 secondes.  

Reply

Marsh Posté le 17-02-2016 à 08:49:48    

Attends, tu passes de 108 sec. à 3 sec. et tu ne trouves pas ça significatif ?
 
Chez moi, ta macro avec le ScreenUpdating à False s'exécute en quelques secondes. Tu voudrais encore l'accélérer ?
 
Le gros travail de Word est sans doute plutôt lié à un rafraichissement graphique de l'écran.

Reply

Marsh Posté le 17-02-2016 à 11:57:22    

J'ai fait tellement d'essais que je me suis mélangé les pinceaux, et mon message n'est pas très clair.
En fait, dessiner des Txt box est tellement lent que j’ai remplacé celles-ci par des rectangles. J’en fais dessiner 500.
 

Code :
  1. Sub MesureDureeRectangles()
  2.   Dim i As Long, Boite As Shape, Debut As Date
  3.   Application.ScreenUpdating = False
  4.   ActiveDocument.Windows(1).Visible = False
  5.   Debut = Time
  6.   For i = 1 To 500
  7.      Set Boite = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 4 * i, 72.75, 4, 19.5)
  8.      Boite.Fill.ForeColor.RGB = RGB(2 * i, 2 * i, 2 * i)
  9.   Next i
  10.   ActiveDocument.Windows(1).Visible = True
  11.   Application.ScreenUpdating = True
  12.   MsgBox CStr((Time - Debut) * 24 * 3600) & " s"
  13. End Sub


La macro s'exécute en 4 secondes.
Si je désactive les lignes 3 et 13, en laissant actives les lignes 4 et 12, la macro s'exécute en 4 secondes.
Si je désactive les lignes 4 et 12 en laissant actives les lignes 3 et 13, on passe à 80 secondes.
Si je désactive toutes ces lignes, 104 secondes.
Chez moi, le ScreenUpdating employé seul fait donc passer de 104 secondes à 80 secondes. C'est certes un gain, mais cela n'a rien de renversant.
 
Si maintenant je remplace les lignes 3 et 4 par ActiveDocument.DowngradeDocument, et les lignes 12 et 13 par ActiveDocument.Convert, le document passe au format Word 2003, et les 500 rectangles sont dessinés en 0 seconde.  
On passe donc de 104 secondes à 0 seconde.
Sous Excel 2010, la macro débarrassée des lignes 3, 4, 12 et 13 s'exécute en moins d'une seconde.
Bref, il y a quelques problèmes avec Word 2010. Dessiner est devenu une vraie galère.

Reply

Marsh Posté le 19-02-2016 à 12:48:15    

 
 
            Merci de ton retour avec ces informations fort intéressantes !
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed