2017-09-27 1 views
0

Je reçois une erreur d'exécution 91 sur le mot suivant VBA:VBA Word obtient une erreur d'exécution 91 avec l'aide Range.Find dans Word tête

Dim myStoryRange As Object 
    For Each myStoryRange In ActiveDocument.StoryRanges 
    With myStoryRange.find 
     .Text = "test to search" 
     .Replacement.Text = "text to replace" 
     .Wrap = wdFindContinue 
     .ClearFormatting 
     .Replacement.ClearFormatting 
     .Replacement.Highlight = False 
     .Execute replace:=wdReplaceAll 
    End With 
Next myStoryRange 

L'erreur se produit de manière incompatible sur environ la moitié des ordinateurs qui exécutent la macro.

Pensées?

suggestion Per j'ai changé PaTriCK le code à lire:

Dim myStoryRange As Range 
For xStories = 1 To ActiveDocument.StoryRanges.Count 

    Set myStoryRange = ActiveDocument.StoryRanges.Item(xStories) 
    With myStoryRange.find 
     .Text = "[Client Name]" 
     .Replacement.Text = Client 
     .Wrap = wdFindContinue 
     .ClearFormatting 
     .Replacement.ClearFormatting 
     .Replacement.Highlight = False 
     .Execute replace:=wdReplaceAll 
    End With 

Next xStories 

Cela semble corriger l'erreur 91. Cependant, je suis toujours obtenir un résultat bizarre. Ce code échoue à la ligne 5 (avec myStoryRange.find) avec l'erreur "Le membre demandé de la collection n'existe pas" sur le deuxième élément de la collection.

Il échoue lorsqu'il existe un membre de la collection. En d'autres termes, il y a 7 xStories, il échoue sur xStories = 2. Et xStories = 2 est un élément complet avec toutes les propriétés référencées présentes. En tant que FYI, j'essaye de remplacer un peu de texte dans l'entête du document. Je reçois un échec sur un élément StoryRange qui se trouve dans l'en-tête, plutôt que dans le corps du document. Cela peut-il être le problème?

+0

mes pensées ... vous n'avez pas inclus toutes les informations ... comme, quelle ligne obtient l'erreur? – jsotola

+0

Vous ne devriez pas 'Dim myStoryRange As Range'? Vous devrez peut-être utiliser la boucle For avec 'ActiveDocument.StoryRanges.Count' et' Set myStoryRange = ActiveDocument.StoryRanges.Item (#) ' – PatricK

+0

Si vous essayez de remplacer du texte dans l'en-tête, pourquoi ne pas choisir la plage que vous voulez avec quelque chose comme 'StoryRanges (wdPrimaryHeaderStory)' au lieu de boucler toutes les histoires? – xidgel

Répondre

0

J'ai été capable de résoudre cette question (avec l'aide des commentateurs). La réponse est que le texte d'en-tête est traité comme un élément de la collection Sections. Cela semble incohérent car il apparaît aussi bien qu'un objet dans StoryRanges. Cependant, j'obtiens une erreur lors de la recherche et du remplacement à l'aide de cette collection.

Le code suivant recherche correctement et remplace le texte dans un en-tête mot:

Dim myStoryRange As Range 

    For xStories = 1 To ActiveDocument.Sections(1).Headers.Count 

     Set myStoryRange = 
     ActiveDocument.Sections(1).Headers.Item(xStories).Range 

     With myStoryRange.find 
      .Text = "[Client Name]" 
      .Replacement.Text = Client 
      .Wrap = wdFindContinue 
      .ClearFormatting 
      .Replacement.ClearFormatting 
      .Replacement.Highlight = False 
      .Execute replace:=wdReplaceAll 
     End With 

    Next xStories