Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1500 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VBA Word prend son temps

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

VBA Word prend son temps

n°2273670
jpl38
Posté le 18-01-2016 à 11:34:00  profilanswer
 

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
mood
Publicité
Posté le 18-01-2016 à 11:34:00  profilanswer
 

n°2273680
Marc L
Posté le 18-01-2016 à 13:18:29  profilanswer
 

 
            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 ?
 

n°2273696
jpl38
Posté le 18-01-2016 à 15:31:21  profilanswer
 

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 ?

n°2273698
jpl38
Posté le 18-01-2016 à 15:51:26  profilanswer
 

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.

n°2273889
Marc L
Posté le 20-01-2016 à 10:47:11  profilanswer
 

 
            Bon ben voir alors à la source chez Microsoft …
 

n°2273920
jpl38
Posté le 20-01-2016 à 16:19:12  profilanswer
 

Marc L a écrit :

 
            Bon ben voir alors à la source chez Microsoft …
 


Tu as un lien à me proposer ?

n°2273929
Marc L
Posté le 20-01-2016 à 20:20:55  profilanswer
 

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

n°2273975
jpl38
Posté le 21-01-2016 à 08:12:07  profilanswer
 

Merci, je vais farfouiller, on ne sait jamais.

n°2275580
jpl38
Posté le 13-02-2016 à 12:05:43  profilanswer
 

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.

n°2275581
SquiZZ
Posté le 13-02-2016 à 12:26:01  profilanswer
 

tu peux essayer avec

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

mood
Publicité
Posté le 13-02-2016 à 12:26:01  profilanswer
 

n°2275591
jpl38
Posté le 13-02-2016 à 13:16:33  profilanswer
 

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.  

n°2275787
Chelmi18
Posté le 17-02-2016 à 08:49:48  profilanswer
 

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.

n°2275804
jpl38
Posté le 17-02-2016 à 11:57:22  profilanswer
 

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.

n°2275897
Marc L
Posté le 19-02-2016 à 12:48:15  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VBA Word prend son temps

 

Sujets relatifs
Probleme compatibilité VBA MSFLEXGRID Excel 2013Retourner une variable à un programme VBA appelant
VBA Word pile saturéeCode VBA trop lent
Publipostage Word en PDF avec base de données ExcelConversion algorithme Python -> VBA (combinaisons de p élém. parmi n)
[Résolu] Rechercher une valeur dans une pagereprogrammer des boutons en VBA
Plus de sujets relatifs à : VBA Word prend son temps


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR