Rechercher/Remplacer TROP LOURD en VBA WORD - Avis aux pros !

Rechercher/Remplacer TROP LOURD en VBA WORD - Avis aux pros ! - VB/VBA/VBS - Programmation

Marsh Posté le 28-08-2006 à 16:14:14    


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... (je ne pense pas que la RAM soit en cause >> PC 1,66Ghz, 1Go Ram - MAC 2x2,66 Ghz avec 5Go de ram). 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...
 
Cela fait une semaine que j'arpente les fichiers d'aide, les forums, je n'ai pour le moment pas de solution...
 
 
Voici le code de mes Macros :
 
En premier, je balise le texte en italique...

Code :
  1. Sub macro1()
  2. Selection.Find.ClearFormatting
  3. Selection.Find.Replacement.ClearFormatting
  4. Selection.Find.Font.Italic = True
  5. Selection.Find.Font.Bold = False
  6. With Selection.Find
  7. .Text = ""
  8. .Replacement.Text = "#I#^&#/I#"
  9. .Forward = True
  10. .Wrap = wdFindContinue
  11. .Format = True
  12. .MatchCase = False
  13. .MatchWholeWord = False
  14. .MatchWildcards = False
  15. .MatchSoundsLike = False
  16. .MatchAllWordForms = False
  17. End With
  18. Selection.Find.Execute Replace:=wdReplaceAll
  19. 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. Sub Macro2()
  2. '
  3. Selection.Find.Execute
  4. Selection.Find.ClearFormatting
  5. Selection.Find.Replacement.ClearFormatting
  6. Selection.Find.Replacement.Style = ActiveDocument.Styles("MonStyleItalic" )
  7. With Selection.Find
  8. .Text = "#I#*#/I#"
  9. .Replacement.Text = "^&"
  10. .Forward = True
  11. .Wrap = wdFindContinue
  12. .Format = True
  13. .MatchCase = False
  14. .MatchWholeWord = False
  15. .MatchWildcards = True
  16. .MatchSoundsLike = False
  17. .MatchAllWordForms = False
  18. End With
  19. Selection.Find.Execute Replace:=wdReplaceAll
  20. End Sub


Enfin, je supprime les balises...

Code :
  1. Sub macro3()
  2. Selection.Find.ClearFormatting
  3. Selection.Find.Replacement.ClearFormatting
  4. With Selection.Find
  5. .Text = "#I#"
  6. .Replacement.Text = ""
  7. .Forward = True
  8. .Wrap = wdFindContinue
  9. .Format = True
  10. .MatchCase = False
  11. .MatchWholeWord = False
  12. .MatchWildcards = False
  13. .MatchSoundsLike = False
  14. .MatchAllWordForms = False
  15. End With
  16. Selection.Find.Execute Replace:=wdReplaceAll
  17. End Sub
  18. Sub macro4()
  19. Selection.Find.ClearFormatting
  20. Selection.Find.Replacement.ClearFormatting
  21. With Selection.Find
  22. .Text = "#/I#"
  23. .Replacement.Text = ""
  24. .Forward = True
  25. .Wrap = wdFindContinue
  26. .Format = True
  27. .MatchCase = False
  28. .MatchWholeWord = False
  29. .MatchWildcards = False
  30. .MatchSoundsLike = False
  31. .MatchAllWordForms = False
  32. End With
  33. Selection.Find.Execute Replace:=wdReplaceAll
  34. End Sub


Vous voyez ce que je veux dire ?  
 
Je cherche également un moyen de rechercher le texte "NON NOIR" au sein de mon document de manière à sélectionner tout le texte de couleur (peu importe la couleur) SAUF le NOIR pour lui appliquer un traitement.
 
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. Sub NettoyerStyles()
  2. ' Macro écrite par anacoluthe
  3. ' Cette Macro supprime tous les styles non utilisés dans le document
  4. For Each oStyle In ActiveDocument.Styles
  5. If Not oStyle.BuiltIn Then
  6. With ActiveDocument.Content
  7. .Find.ClearFormatting
  8. .Find.Style = ActiveDocument.Styles(oStyle)
  9. If Not .Find.Execute() Then
  10. oStyle.Delete
  11. End If
  12. End With
  13. End If
  14. Next
  15. MsgBox "Les styles inutilisés ont été supprimés !"
  16. End Sub


GRAND MERCI à tous ceux et celles qui auront la gentillesse de me répondre...

Reply

Marsh Posté le 28-08-2006 à 16:14:14   

Reply

Marsh Posté le 01-09-2006 à 13:43:15    

Bonjour,
 
Voici pour le style itaic en une seule macro
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
 
pour le noir
Il faut mettre au début de ton fichier <COULEUR>
et a la fin </COULEUR>.
Attention ces 2 balises doivent être non noire
Ensuite tu fais comme pour l'italique
 recherche du noir
remplacer par </COULEUR>texte noir<COULEUR>
et après tu recherches
\<COULEUR\>@\</COULEUR\> ( avec critères spéciaux)
 
 

Reply

Marsh Posté le 04-09-2006 à 17:15:31    

MILLE MERCIS !!!!!!!!!!!!!
Cette macro est tout simplement géniale et répond parfaitement à mon besoin !!!
Je peux enfin travailler sur ces gros fichiers sans voir Word tomber à bout de souffle...
Sur MAC comme sur PC d'ailleurs !
Pyrof, je suis ton débiteur ;-)
 
Peux-tu me commenter la toute dernière ligne de ton code concernant la couleur ?
Je t'avoue n'avoir pas tout compris...
 
Ca j'ai compris... C'est d'ailleurs malin d'avoir tourné le problème à l'envers ;-)
Baliser le noir, je t'avoue que je n'y aurais pas pensé... Pourtant c'est bête comme choux...

Citation :


pour le noir Il faut mettre au début de ton fichier <COULEUR> et a la fin </COULEUR>.  
Attention ces 2 balises doivent être non noire.


 
Ca aussi j'ai compris... Dès que l'on rencontre du noir, on positionne une balise de fermeture avant et une balise d'ouverture après...
Encore une fois c'est super malin ! (on t'as déjà dit que tu étais un grand malade ...?  :pt1cable: )

Citation :


Ensuite tu fais comme pour l'italique recherche du noir remplacer par </COULEUR>texte noir<COULEUR>  


 
Mais c'est là que ça se corse pour moi. Même en connaissant un peu l'usage des caractères génériques, j'ai un peu de mal à comprendre ...

Citation :


et après tu recherches  
\<COULEUR\>@\</COULEUR\> ( avec critères spéciaux)  


 
Quoi qu'il en soit, Encore mille mercis !!!
Je brandirais partout ton nom en étendard, en narrant à qui voudra l'entendre l'histoire fantastique de pyrof venu à mon secours... ;-)
 
Bon, allez, j'arrête là mes remerciements, mais vraiment je planche la-dessus depuis un moment et tu m'as sorti une sacré épine du pied !
 
J'espère avoir la chance de te lire à nouveau !
 

Reply

Marsh Posté le 05-09-2006 à 16:26:47    

Bonjour
 
Avec du retard ...
 
Les caractères generiques sont très uitiles
 
@ = n'importe quel caractère un ou plusieurs
mais si tu veux rechercher le caractère @ il faut le précéder de \ donc \@
 
@ recherchera nimporte quel caractère
\@ recherchera le caracère @
 
Il en va ainsi pour @ , <,>
< :recherche en début de mot
\< recherche du caractère <
 
> recherche en fin de mot
\> recherche du caratère >
 
Voilà, mais il en existe beaucoup Regarde l'aide de word elle est bien faite
 
Bon courrage

Reply

Marsh Posté le 06-09-2006 à 10:22:35    

Super, merci encore pour cette explication très claire.
Je connais les caractères génériques, pas complètement cependant comme tu l'avais deviné.
J'avais lu le rôle de l'anti slash quelque part mais je l'avais oublié ;-)
 
Reste plus qu'à tester et mettre en oeuvre tout ça pour la partie 'couleur'...
Pour la première macro c'est vraiment nickel. Au bout d'un certain nombre de "chercher/remplacer" consécutifs, Word perd quand même les pédales mais il suffit de scinder les gros documents en deux pour régler le problème (1)...  
Grâce à ton bout de code, je n'utilise désormais plus qu'une macro au lieu de trois auparavant ce qui est déjà excellent.
 
Encore une fois, mille merci à toi pour ton aide précieuse !!!
 
 
(1) Je me demande bien si il y a un moyen de palier à cette 'difficulté'... Sur Mac, la macro indique qu'un trop grand nombre de remplacements sont en cours dans le document, stoppe et lance carrément le débogueur.
Sur PC, Word prévient simplement que la 'mémoire' est insuffisante pour pouvoir effectuer une éventuelle annulation mais autorise toutefois la marco à achever son travail...
Compte tenu de la mémoire dont je dispose sur mes deux machines (5Go pour le mac et 1 Go sur le PC) je me doute bien que ce n'est pas de la mémoire physique dont il est question mais d'une sorte de zone tampon, d'une zone mémoire qui appartiendrait à Word et qui serait en quelque sorte limitée...
Peut-être existe t-il une manière d'augmenter ou de 'vidanger' cette zone tampon ? (une sauvegarde entre chaque macro ne change rien, j'ai essayé...)


Message édité par kitcreanet le 06-09-2006 à 10:23:20
Reply

Sujets relatifs:

Leave a Replay

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