Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/03/2011, 14h47   #1
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Par défaut Accélérer exécution du traitement

Bonjour,

J'ai un document de plusieurs centaines de pages (+ de 1000) et environ 600 sections dont je dois extraire environ 250 sections à partir d'une phrase clé.
Mon problème apparait lorsque je lance ma macro qui effectue cette opération (environ 15 minutes) où j'ai parfois le message suivant m'indiquant un manque de mémoire et que si je continue, l'opération ne pourra plus être annulée.

Comment puis-je passer outre cela?

Est-ce que cela vient de ma macro (Extraction des sections très compliquée à réaliser puisque recherche d'un texte cible puis copie de la section.)

La partie Sélection du nom :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
   Set fin = ActiveDocument.Range
   Selection.HomeKey unit:=wdStory
   With Selection.Find
        .Text = "réunie le"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveRight unit:=wdCharacter, Count:=2, Extend:=wdMove
    Selection.MoveEnd unit:=wdParagraph
    Selection.MoveLeft unit:=wdCharacter, Count:=1, Extend:=wdExtend
    nom = Selection.Range.Text
L'objet sélection est exécuté une seule fois donc pas de souci.

Recherche phrase clé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 With fin.Document.Content.Find
      Do While .Execute(FindText:="Phrase clef", Forward:=True, _
            Format:=True) = True
 
 
        Set myrange = fin
 
         fin.Find.ClearFormatting
            With fin.Find
           .Text = "Phrase clef"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
       fin.Find.Execute
        Set r = myrange.GoTo(what:=wdGoToPage, which:=wdGoToFirst, Count:=fin.Information(wdActiveEndPageNumber))
Loop

Je ne peux malheureusement pour des raisons de confidentialité vous mettre à disposition ma macro.
Je vais la renommer et exécuter le publipostage sans données personnelles.

Attention le publipostage est lancé depuis un ERP donc j'interviens par macro derrière après la fusion en détectant l'évènement de fin de fusion.

Cela se passe sans souci, le problème est réellement dans la copie de la section voulue dans un autre document qui fait à la fin environ 250 pages.

Je travaille bien évidemment avec des range partout et j'ai déjà désactivé les options d'affichage suivantes.

Code :
1
2
3
4
5
6
7
8
9
10
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
 
  ActiveWindow.View.Type = wdNormalView
 
    With Options
        .CheckSpellingAsYouType = False
        .CheckGrammarAsYouType = False
        .Pagination = False
    End With

Je recherche à désactiver l'option d'historique pour ne pas garder de traces au risque de ne pouvoir annuler, ce n'est pas grave. De toute façon, le traitement ne sera pas annulé mais réexécuté sans la macro en cas de plantage (près de 5 minutes de fusion).

Merci de votre aide. Si vous avez des questions, n'hésitez pas, j'essaierai d'expliciter mieux mon problème.

personnellement, je pense que cela est dû à la longueur du document Word généré.
Cependant, je ne peux faire autrement puisque je ne peux prévoir de sélectionner les parties dans un nouveau document (environ 250 enregistrements à fusionner).

Le principal est que mon code marche mais il est malheureusement très long à s'exécuter ce qui ralentit cette fusion puis impression.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h25   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Je ne pense pas que ce soit la recherche qui pose problème, mais le traitement que tu fais àprès la recherche qui génère cette lenteur.

Lorsque l'on dépasse un certain nombre d'oprération dans un certain laps de temps, Word n'est plus en mesure d'enregistrer les différences avec le document initial, c'est la raison de ce message.

Essaie d'enregistrer en cours de route le fichier pour le message.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h52   #3
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour Olivier,

Merci de ta réponse, effectivement, le traitement après est très long mais mon but premier était d'optimiser ma macro.
Toutefois, je ne vois pas trop comment je peux le réaliser désormais à part en retouchant peut-être la partie d'extraction. Mais en fait le plus long est la copie page par page une fois les emplacements récupérés dans un tableau (ce qui ne peut pas s'optimiser?)

Effectivement, en insérant une sauvegarde au milieu, je n'ai plus le message d'erreur.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 17h01   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Pour atteindre un endroit dans un document, la méthode de recherche est la plus performante que je connaisse.

Si on la compare avec une boucle sur les paragraphes ou les mots d'un texte, c'est sans appel, .Find est imbattable.
Comment fais tu la copie ? Par un Copy ou par transfert de la portion de document dans un objet Range que tu inséres dans le second document ?
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 22h59   #5
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Citation:
Comment fais tu la copie ? Par un Copy ou par transfert de la portion de document dans un objet Range que tu inséres dans le second document ?
Je copie effectivement le range de la zone dans un autre document
je ne pense pas gagner enormement à faire un couper suivi d'un coller.
puis une boucle pour le delete en partant de la fin pour evitant d'avoir a repaginer.

Je pourrais essayer lundi avec un couper.
C'est bien le plus rapide?
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 23h06   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Un copier coller ou couper coller va ralentir le processus global.

Ce qui serait intéressant et d'utiliser un objet range pour faire le transfert d'un document à l'autre.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 10h51   #7
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Citation:
Ce qui serait intéressant et d'utiliser un objet range pour faire le transfert d'un document à l'autre
j'utilise bien un objet range et je copie le range pour le transfert, je peux faire mieux?
Je ne comprends pas ce que tu veux dire. Peux tu me mettre un petit exemple
Merci.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 13h44   #8
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Avec un code de ce genre :

Code :
1
2
3
4
5
6
7
8
9
 
Sub TrfUnRange()
Dim myR As Range
 
Set myR = Application.Documents("Document1").Range
 
Application.Documents("document2").Range = myR
 
End Sub
On évite les actions copier coller.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 21h21   #9
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour Olivier,

Je teste demain, et te tiens au courant et déjà merci, j'avais pas eu l'idée.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 17h14   #10
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Merci Olivier

Pour la sauvegarde régulière du fichier, cela marche parfaitement aussi.



J'ai rajouté pour l'optimisation le fait de désactiver les options d'orthographe, grammaire et de pagination du document. (Objet document)

Code :
1
2
3
4
5
    With Options
        .CheckSpellingAsYouType = False
        .CheckGrammarAsYouType = False
        .Pagination = False
    End With
désactiver l'affichage écran et les alertes (Objet Application)
Code :
1
2
Application.ScreenUpdating = True
    Application.DisplayAlerts = True
Le mode d'affichage est changé en normal au lieu de page
Code :
ActiveWindow.View.Type = wdNormalView
à la fois les révisions (Trackrevisions) et la commande annuler (CTRL + Z) undoclear.

Code :
1
2
3
4
5
 
dim m as Word.Document
set m = ActiveDocument
    m.TrackRevisions = False
    m.UndoClear
Est-ce que je peux désactiver d'autres options pour accélérer l'exécution? Ceci dit, elle est désormais nettement plus rapide.

PS : Je ne crois pas que dans la FAQ, il y ait une partie sur l'optimisation de code (Vitessse d'exécution et bonnes habitudes de codage).

Ce serait bien d'en avoir une partie au moins pour les opérations les plus courantes.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/03/2011, 17h21   #11
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

C'est effectivement une idée pour une entrée dans la FAQ.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h53.


 
 
 
 
Partenaires

Hébergement Web