Vb6-Word_Find&Replace

Signaler
Messages postés
8
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
4 octobre 2011
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous.

Tout d'abord, je tiens à remercier les membres de Codes-Sources, pour l'ensemble des codes mis à dispositions. Quelle mine d'or !!!
Voilà qlques années que j'y trouve mon bonheur.
Mais là, je coince

Je tente de remplacer un texte par un autre, dans un document Word(2003), avec les commandes Find et Replace.

Mon texte est bien remplacé par l'autre, mais se retrouve systématiquement en MAJUSCULE !?

Voici mon code :
[i]Dim objWord As Word.Application
Dim docWord As Word.Document
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set docWord = objWord.Documents.Open(txtFile1.Text)
'path+fileName récupéré dans une zone de texte
With Selection.Find
.Text = "XXX1"
.Replacement.Text = "AbCdEf"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceOne
.../i
Le texte "XXX1" est bien trouvé, mais il est remplacé par "ABCDEF" au lieu de "AbCdEf".
Dans le document Word, le style du texte "XXX1" est 'Courant'.Pas de contrainte Majuscule dans la définition du style du paragraphe.

J'ai le sentiment d'avoir omis un truc énorme, mais je ne vois pas quoi!?

Merci pour votre aide précieuse.

The YellowAnt

11 réponses

Messages postés
8
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
4 octobre 2011

Voici une info supplémentaire :

Tout se passe bien si le texte original (ici, "XXX1")comporte au moins une lettre minuscule ...

Pas Glop !!!

Si quelqu'un a une idée concernant une piste à suivre, elle est la bienvenue.

Merci.

The YellowAnt
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Bonjour

En effet sans macro j'obtiens la meme chose que toi.

En fait, je crois savoir d'ou cela vient : de la mise en forme (que ce soit un style ou un attribut de la partie du texte qui positionne le texte en musjuscule).

Je tape dans mon texte xxxx1 que je mets en police majuscule (format/police)

Je fais remplacer
XXX1
par abcDef

et bien sur il apparait sous la forme ABCDEF
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut

Je pencherait pour un problème de correction automatique et les mots comportant des chiffres. J'ai un vague souvenir d'une option concernant ce type de 'mot'.

As-tu jouer avec .MatchCase et .Format ?
Je ne pense pas que .MatchCase ait une influence sur le texte de remplacement, mais on ne sait jamais.
Quant à .Format, cela permettait de remplacer aussi le format, je pense.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
8
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
4 octobre 2011

Salut Loulou69,

Je pensais aussi à un problème du genre, mais mon texte original n'est pas en format/police majuscule ...


Bonjour Jack,

J'avais également pensé à la correction automatique, et je l'ai désactivée ... mais sans succès.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,

Je viens de le faire manuellement, pour y voir clair.
Le phénomène se produit également depuis la boîte de dialogue "remplacer". Manuellement, donc !
J'observe toutefois que les choses se passent bien lorsque l'on coche la case "utiliser les caractères génériques" (sans que l'on puisse comprendre la relation de cause à effet !) . J'observe également que lorsque l'on coche cette case, les deux premières ("respect de la casse" et "Mot entier" sont inhibées de ce seul fait).

Une précision : ma version est Office 2007 !

Ce n'est pas compréhensible, mais c'est le résultat de ce que je constate !

Par VBA, cela devrait donc être du genre :
With Selection.Find
.Text = "XXX1"
.Replacement.Text = "AbCdEf"
.Forward = True
.Wrap = wdFindContinue
.Format = False


. MatchWildcards = True

.MatchSoundsLike = False
.MatchAllWordForms = False
End With
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Ceci (testé) marche très bien :
With Selection.Find
        .Text =  "XXXX1"
        .Replacement.Text = "vv"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceOne



C'est ce que j'appelle toutefois S C A N D A L E U X (sans la moindre hésitation).

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
8
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
4 octobre 2011

Merci à tous pour votre aide précieuse.

Grrrrr, Microsoft !!!


The YellowAnt
Messages postés
8
Date d'inscription
lundi 3 février 2003
Statut
Membre
Dernière intervention
4 octobre 2011

Voici les dernières news :

With Selection.Find
.Text = "XXXX1"
.Replacement.Text = "vv"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceOne

Pour que ça fonctionne également dans VB6, je dois supprimer les lignes en rouge!
Ces options à cocher sont d'ailleurs grisées, dans la boîte de dialogue 'rechercher/remplacer', dans Word, lorsqu'on coche 'Utiliser les caractères génériques'.

The YellowAnt
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
ouais ! Vraiment scandaleux !
Et je ne trouve pas comment faire alors s'il s'agit de ne changer "XXXX1" par "vv" avec comme condition que XXXX1 soit un mot entier !
Le subterfuge utilisé transformerait en effet "XXXXXXX1AA" en "XXXvv1AA" alors que "XXXX1" n'est pas trouvé comme mot entier !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bon ...
Voici une astuce qui marche et respecte tant la casse (dans les deux sens) que les mots entiers :
With Selection.Find
        lemaudit = "µSoft"
        remplacer_par = "hello"
        .Text = "XXXX1"
        .Replacement.Text = lemaudit & remplacer_par & lemaudit
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = True
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
        .Execute FindText:=lemaudit & remplacer_par & lemaudit, MatchWholeWord:=True, ReplaceWith:=remplacer_par, Replace:=wdReplaceAll
  End With


Bien sur, si pour ne remplacer qu'une seule occurence : mettre Replace:=wdReplaceOne à la place de Replace:=wdReplaceAll

Conclusion : on s'en sort par une bidouille, mais il est honteux d'en arriver là !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Plus subtil et sans ajout d'une insulte à qui vous savez ===>>

 With Selection.Find
        remplacer_par = "Hello"
        .Text = "XXXX1"
        .Replacement.Text = remplacer_par
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = True
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
        .Execute FindText:=remplacer_par, MatchWholeWord:=True, ReplaceWith:=remplacer_par, Replace:= wdReplaceAll
      End With


où l'on remplace le contenu d'une variable par ... son propre contenu !!! (faut le faire !)
Et ... ça marche !
Je me demande s'il ne faudrait pas en faire un snippet pour faire face à cette bourde de Word 2007.
Une question, à propos de cette bourde : est-elle également présente sur d'autres versions que la 2007 ?
Des âmes charitables possédant d'autres versions pour nous renseigner sur ce point ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient