2010-11-22 5 views
3

J'utilise cette fonction pour remplacer certaines chaînes de l'accès dans un document Word. Cette fonction fonctionne assez bienProblème gênant avec la clause "with" dans VBA

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 
    With doc.Content.Find 
     .Text = after 
     .Replacement.Text = before 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute replace:=wdReplaceAll 
     Else 
      .Execute replace:=wdReplaceOne 
    End If 
    End With 
End Sub 

Mais ... Je ne sais pas pourquoi si je réécris la fonction de cette façon, il cesse de fonctionner. Il n'y a pas d'erreur ou d'avertissement, mais les remplacements ne sont pas faits. Est-ce que quelqu'un peut expliquer quelle est la différence entre ces deux extraits ou pourquoi le second ne fonctionne pas correctement?

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 
    doc.Content.Find.Text = after 
    doc.Content.Find.Replacement.Text = before 
    With doc.Content.Find 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute replace:=wdReplaceAll 
     Else 
      .Execute replace:=wdReplaceOne 
     End If 
    End With 
End Sub 
Merci!

Répondre

7

La propriété Trouver retourne un objet Recherche chaque fois que vous l'appelez. Donc, dans votre deuxième extrait de code que vous êtes

  1. Création d'un objet Rechercher et en définissant sa propriété Text
  2. Création d'un nouveau Trouver un objet et sa propriété de Replacement.Text
  3. Création d'un troisième objet Rechercher et définir une tas d'autres propriétés et en cours d'exécution

Ce dernier objet Find n'a pas ses propriétés Text ou Replacement.Text. Si vous souhaitez l'utiliser de cette manière, vous pouvez créer une variable d'objet comme

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 

    Dim fnd As Find 

    Set fnd = doc.Content.Find 

    fnd.Text = after 
    fnd.Replacement.Text = before 
    With fnd 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute Replace:=wdReplaceAll 
     Else 
      .Execute Replace:=wdReplaceOne 
     End If 
    End With 
End Sub 
+0

Bonne réponse-cause et réponse-code. Vous pouvez et devez indiquer clairement que vous êtes en train d'énumérer les problèmes du deuxième extrait de code. – jpinto3912

+1

Pouah. Je suis sûr que vous avez raison, mais il est assez révoltant que l'accès à une propriété crée un nouvel objet à chaque fois. – Vicky

+0

@Vicky, pas vraiment, si vous voulez dire que la méthode Find renvoie un objet, cela a plus à voir avec le fait que vous n'utilisez pas l'initialisation d'un objet fortement typé à la valeur de retour de votre méthode de recherche. puis attendre les valeurs de propriété de deux objets différents implicitement typés pour maintenir l'état entre les uns et les autres ... hmm. –

1

Est-ce un véritable copier-coller de votre code? Ces deux devraient fonctionner de manière identique. Êtes-vous sûr qu'il ne se passe rien d'autre comme des fins de ligne impaires?

(je remarque dans le premier exemple votre End If n'est pas correctement mis en retrait, mais je doute que ce soit quelque chose à voir avec elle)

+0

Oui, c'est vraiment une copie de mon code. Je pense aussi que ces deux fonctions devraient fonctionner à l'identique ... On suppose que la clause WITH n'est que du sucre syntaxique. C'est la raison de ma question et la raison de mon mal de tête. Merci! – Jonathan