IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

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


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    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

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Un autre élément de réponse : Regarde ClearFormatting dans l'aide.
    Si tu fais
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("MonStyleItalic")
    VBA peut ignorer la mise en forme... Tu regardes ça

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    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".

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub save()
        ActiveDocument.save
    End Sub
    entre chacun de mes appels de macro...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
        Selection.HomeKey Unit:=wdStory
    Puis tu sélectionnes jusqu'à la page suivante pour faire tes remplacements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 20
    Points : 11
    Points
    11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. [XL-2010] SOMMEPROD trop lourd, remplacer en VBA
    Par ClaireD dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 12/10/2012, 15h20
  2. Demande d'avis aux pros de SQL (performances)
    Par vinze60 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 14/01/2010, 16h39
  3. [VBA-E]Avis aux experts, l'ouverture de fichier
    Par Masmeta dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2007, 10h16
  4. Réponses: 4
    Dernier message: 12/10/2006, 17h03
  5. [Avis aux pros !] Problèmes de la VCL avec les threads
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/02/2006, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo