Création d’une macro de recherche/remplace

 

Il arrive fréquemment que certains documents, une fois qu’ils ont été chargés dans Word, comportent des caractères qu’il est nécessaire de transcoder afin de rendre ces documents exploitables. Parmi ces caractères qui viennent parasiter un texte, on peut notamment citer les voyelles accentuées qui ont mal supporté le passage d’un système à l’autre (de DOS à Windows, de Mac à Windows ou bien encore de HTML à Word) ou les césures rajoutées par les logiciels de PAO. Quand la séquence de remplacement est évidente, une simple commande globale de recherche/remplace suffit à résoudre le problème ; ainsi, on recherchera la chaîne « é » pour la remplacer par le caractère « é ». Parfois, les difficultés sont plus complexes et l’emploi d’une macro est alors le seul recours possible. Le principal problème provient du fait que le caractère à rechercher est difficilement identifiable et il est impossible de le saisir dans la commande de recherche/remplace. Le caractère peut, par exemple, se présenter sous la forme d’un carré et à la lecture du texte, il paraît évident que ce carré représente plusieurs caractères différents. De plus, si l’on tente de copier ce carré, puis de le coller dans le champ « Recherche » de la commande de recherche/remplace, la manœuvre n’aboutit pas.

On peut voir un aperçu de ce genre de problème en téléchargeant un document sur le Web à l’adresse suivante :

http://disc.vjf.inserm.fr:2010/basisrapports/asthme_gch.html

 

On trouve sur cette page une série de fichiers au format PDF et lorsque l’on effectue un copier/coller de l’un de ces documents dans Word, on se heurte au fait que certains caractères introduisent du bruit dans le texte original ; par exemple, le caractère ­ indique une marque de césure ; on s’aperçoit également que certains caractères représentent en fait deux caractères. Ainsi les séquences « fi » et « fl » sont chacune représentées par un seul caractère, ce qui signifie que les termes inflammation et infiltration seront considérés par Word comme mal orthographiés.

Pour illustrer notre propos, vous trouverez ci-dessous un extrait d’un de ces textes :

 

L’étiologie de l’asthme est encore mal connue. Cette pathologie se caractérise par des épisodes récurrents de sifflements, de toux et d’essoufflement : les crises. Chez l’adulte, il a pu être établi que la sévérité des crises est condition-née par le degré de l’inflammation bronchique (pour revue, Bousquet et coll., 1999). Il est vraisemblable qu’il en est de même chez le petit enfant, mais l’inflammation des voies aériennes est difficile à évaluer par les méthodes invasives couramment employées chez l’adulte. Toutefois, les quelques don-nées de la littérature montrent que l’immunopathologie de l’asthme infantile reflète celle de l’asthme chez l’adulte (Chedevergne et coll., 2000). Une amélioration des techniques d’évaluation de l’inflammation chez l’enfant devrait permettre de mieux comprendre et surveiller la maladie. Les événe­ments initiaux responsables de l’installation d’un état inflammatoire suscepti­ble de se manifester par l’asthme ne sont pas encore identifiés, alors que des avancées dans ce domaine seraient primordiales en termes de santé publique (pour revue, Holgate, 1999).

 

Pour remettre le texte dans son état normal, il convient donc de chercher ces caractères et de les supprimer ou de les remplacer par la bonne chaîne de caractères (fi ou fl, par exemple). Malheureusement, la commande de recherche/remplace classique est inopérante car il est impossible de saisir certains caractères à rechercher dans la boîte de dialogue Rechercher et remplacer, un copier/coller ne fonctionnant pas mieux.

Deux macros très courtes vont nous permettrent de résoudre ces difficultés.

La première étape consiste à identifier le code du caractère à rechercher. Pour ce faire, il faut écrire une macro qui donne le code de ce caractère. On utilisera les fonctions ASC et ASCw qui renvoient le code ASCII d’un caractère. La fonction ASCw permet de traiter les caractères UNICODE. On emploiera la propriété Selection de Word qui renvoie le contenu de la sélection. Voici le texte de la macro :

 

Sub code_caract()

    If Len(Selection) <> 1 Then

        MsgBox ("Vous devez sélectionner un seul caractère !")

    Else

        MsgBox Asc(Selection)

        MsgBox AscW(Selection)

    End If

End Sub

 

Pour tester la macro, sélectionnez un caractère puis exécutez la commande Outils | Macro | Macros et choisissez d’exécuter la macro intitulée code_caract. Deux boîtes de dialogue affichent successivement le code ASCII et le code UNICODE du caractère. On prendra soin de noter les deux valeurs renvoyées par les fonctions.

Ensuite, il faut programmer une macro de recherche/remplace qui prenne en compte les valeurs trouvées par la macro précédente. Pour ce faire, le plus simple est d’enregistrer une macro que l’on modifiera ultérieurement. Exécutez la commande Outils | Macro | Nouvelle macro et effectuez n’importe quelle commande de recherche/remplace globale. Vous obtiendrez alors une macro dont le code ressemble à ceci :

 

Sub Macro1()

'

' Macro1 Macro

' Macro enregistrée le 29/01/2004 par Dominique

'

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = "par contre"

        .Replacement.Text = "en revanche"

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

End Sub

 

Même si l’on ne connaît pas très bien VBA, il est clair que seules deux propriétés nous intéressent : Text et Replacement.Text.

Dans cet exemple, on va rechercher le code UNICODE n° -1279 pour le remplacer par la séquence fi, ce qui donne le code suivant :

 

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = ChrW(-1279)

        .Replacement.Text = "fi"

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

 

On utilise la fonction inverse de ASCw qui est CHRw. Cette fonction renvoie un caractère dont on passe en paramètre le code (ASCII ou UNICODE).

Si l’on souhaite supprimer le caractère de césure qui a pour code ASCII 31, on écrira alors la macro suivante :

 

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = Chr(31)

        .Replacement.Text = ""

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

 

On voit ainsi que grâce à deux macros qui sont simples à écrire, on peut résoudre un problème impossible à régler par l’interface utilisateur de Word. De plus, si le texte à transcoder est long, ces deux macros font gagner un temps considérable.