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 25/08/2006, 12h05   #1
Invité de passage
 
Inscription : août 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 20
Points : 3
Points : 3
Par défaut Rechercher/Remplacer TROP LOURD en VBA WORD - Avis aux pros !

Bonjour à tous.
Je vous présente ici un problème que je ne parviens pas à résoudre vu mon niveau de débutant en VBA. J'ai préparé une macro qui effectue un balisage via des opérations de chercher/remplacer en nombre très important dans des documents Word pouvant atteindre plusieurs centaines de pages... Sur PC, la macro fonctionne presque correctement, un message préviens que les ressources mémoires étant insuffisantes, aucune annulation ne pourra être effectuée, mais la macro continue son travail... Sur Mac, une erreur se produit et l'exécution de ma macro est interrompue... (ce n'est pas un problème de RAM, les deux machines sont équipées de 2 Gigas de Ram, je pense plutôt à un problème chez Word). Sans même parler du fonctionnement de VBA qui est très différent entre la version PC (WORD 2003) et mac (Word 2004), je pense que mes macros sont très lourdes et pourraient être optimisées...
Voici le code de mes Macros :

En premier, je balise le texte en italique...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Sub macro1()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Font.Italic = True
Selection.Find.Font.Bold = False
With Selection.Find
.Text = ""
.Replacement.Text = "#I#^&#/I#"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Ensuite, j'applique un style sur le texte balisé en me servant de ces balises pour repérer le texte à baliser...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Sub Macro2()
'
Selection.Find.Execute
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("MonStyleItalic")
With Selection.Find
.Text = "#I#*#/I#"
.Replacement.Text = "^&"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Enfin, je supprime les balises...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
Sub macro3()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "#I#"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
Sub macro4()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "#/I#"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Vous voyez ce que je veux dire ?

Une dernière chose, je cherche un moyen fiable pour supprimer les styles non utilisés dans mon document. J'ai trouvé cette macro, mais elle fonctionne de façon sporadique, un coup ça marche, un coup non... "oStyle" génère parfois des erreurs, sur PC comme sur Mac...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Sub NettoyerStyles()
' Macro écrite par anacoluthe
' Cette Macro supprime tous les styles non utilisés dans le document
For Each oStyle In ActiveDocument.Styles
If Not oStyle.BuiltIn Then
With ActiveDocument.Content
.Find.ClearFormatting
.Find.Style = ActiveDocument.Styles(oStyle)
If Not .Find.Execute() Then
oStyle.Delete
End If
End With
End If
Next
MsgBox "Les styles inutilisés ont été supprimés !"
End Sub
GRAND MERCI à tous ceux et celles qui auront la gentillesse de me répondre...
kitcreanet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 12h15   #2
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Un élément de réponse : Quand tu fais des remplacements, Word les garde en mémoire pour un éventuel retour en arrière. Une option permet de l'éviter. Tu cherches, en attendant que quelqu'un qui l'a en tête te l'indique, ou qu'elle me revienne en mémoire
Bonne chance
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 12h22   #3
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Un autre élément de réponse : Regarde ClearFormatting dans l'aide.
Si tu fais
Citation:
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("MonStyleItalic")
VBA peut ignorer la mise en forme... Tu regardes ça
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 12h54   #4
Inactif
 
Avatar de jmfmarques
 
Inscription : décembre 2005
Messages : 3 784
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 3 784
Points : 4 125
Points : 4 125
Une idée (idiote , sans doute... ??)...
Word libère beaucoup de la mémoire utilisée lors de modifications lorsque l'on enregistre le fichier. Un enregistrement intermédiaire pourrait alors être "salutaire".
jmfmarques est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 14h25   #5
Invité de passage
 
Inscription : août 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 20
Points : 3
Points : 3
Citation:
Envoyé par jmfmarques
Une idée (idiote , sans doute... ??)...
Word libère beaucoup de la mémoire utilisée lors de modifications lorsque l'on enregistre le fichier. Un enregistrement intermédiaire pourrait alors être "salutaire".
Merci pour cette idée qui n'a rien d'idiote ;-)
Mon traitement étant réalisé par plusieurs macros (je sais par expérience qu'il vaut mieux lancer susccessivement plusieurs petites macros plutôt qu'une seule) j'ai intercalé
Code :
1
2
3
4
 
Sub save()
    ActiveDocument.save
End Sub
entre chacun de mes appels de macro...
Code :
1
2
3
4
5
6
 
Application.Run MacroName:="macro 1"
Application.Run MacroName:="save"
Application.Run MacroName:="macro 2"
Application.Run MacroName:="save"
etc...
Malheureusement, ça n'a pas fonctionné. Word m'indique toujours un nombre de remplacement trop important... La boîte de dialogue indique :

Erreur d'exécution 5250
Ce document fait l'objet d'un trop grand nombre de modifications. Cette opération sera incomplète. Enregistrez votre document.

Puis j'ai les boutons :

Continuer [Grisé] - Fin - Débogage - Aide

Le débogage renvoie vers une ligne
Selection.Find.Execute Replace:=wdReplaceAll

... J'espère que ça va faire avancer le schmilblick...

Merci pour les autres réponses ouskel'n'or, je vais chercher du côté de ces pistes...


D'ores et déjà merci pour votre aide...
kitcreanet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 16h13   #6
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Désolé, je n'ai pas retrouvé. J'ai dû rêvé, ça m'arrive...
Par contre, et à défaut de trouver mieux, en plus de la solution de jmf, tu pourrais travailler page après page. Au début, tu te place en début de doc
Code :
    Selection.HomeKey Unit:=wdStory
Puis tu sélectionnes jusqu'à la page suivante pour faire tes remplacements
Code :
1
2
3
4
    With Selection
        .ExtendMode = True
        .GoTo What:=wdGoToPage, Which:=wdGoToNext, Count:=1
    End With
Ceci dit, avec 2 Go de ram, je ne comprends pas...
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2006, 18h15   #7
Invité de passage
 
Inscription : août 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 20
Points : 3
Points : 3
Par défaut Solution Trouvée !!!

Bonjour à tous !

la solution n'est pas venu de ce forum mais de celui de Hardware.fr sur lequel j'avais également posté...

L'excellent "pyrof" m'a répondu et m'a donné la solution suivante qui fonctionne parfaitement ! (exemple pour l'italic)
Je la délivre ici en espérant qu'elle pourra servir à d'autres membres du forum...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
With Selection.Find 
    .ClearFormatting 
    .Text = "" 
    .MatchWildcards = False 
    .Forward = True 
    .Font.Italic = 1 
    .Replacement.ClearFormatting 
    .Replacement.Text = "^&" 
    .Replacement.Style = ActiveDocument.Styles("Style1" ) 
    .Execute Replace:=wdReplaceAll 
End With
Grand merci à Pyrof, donc, et merci quand même à ceux et celles qui ont bien voulu tenter de m'aider sur ce forum ! à bientôt !

____________
Une devise qui n'est pas de moi (mais que j'aime bien)
Si tu ne sais pas, demande, mais si tu sais, partage...
kitcreanet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h01.


 
 
 
 
Partenaires

Hébergement Web