Vb6-Word_Find&Replace

YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011 - 19 sept. 2011 à 15:51
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 20 sept. 2011 à 17:11
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

YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
19 sept. 2011 à 16:09
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
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 sept. 2011 à 16:30
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
19 sept. 2011 à 16:50
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)
0
YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
20 sept. 2011 à 06:52
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
20 sept. 2011 à 07:28
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
20 sept. 2011 à 07:59
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
0
YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
20 sept. 2011 à 09:01
Merci à tous pour votre aide précieuse.

Grrrrr, Microsoft !!!


The YellowAnt
0
YellowAnt Messages postés 8 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 4 octobre 2011
20 sept. 2011 à 09:25
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
20 sept. 2011 à 09:46
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
20 sept. 2011 à 12:52
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 234
20 sept. 2011 à 17:11
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
0