2013-03-11 1 views
1

Je crée un document volumineux à partir de modèles. Chaque modèle a un mot-clé #OVERALLPAGENUMBER# dans le pied de page que je remplace par programme (en utilisant Excel VBA) avec un champ.Configuration d'un champ imbriqué dans Word à l'aide de VBA

Si je avais besoin était le numéro de page de ce document, ce qui suit suffirait:

Dim storyRange As Object 'Word.Range 
For Each storyRange In oDoc.StoryRanges 
    Do 
     With storyRange.Find 
      .Text = "#OVERALLPAGENUMBER#" 
      .Wrap = 1 'wdFindContinue 
      .Execute 
      While .found 
       storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True 
       .Execute 
      Wend 
     End With 
     On Error Resume Next 
     Set storyRange = storyRange.NextStoryRange 
     On Error GoTo 0 
    Loop While Not storyRange Is Nothing 
Next 

Je l'ai testé ce code, et il met avec succès le numéro de page dans le pied de page. Ce que je veux, cependant, est un champ imbriqué (formule) qui ajoute un nombre fixe au numéro de page afin que je puisse afficher un nombre de pages sur plusieurs documents. Ma solution, si je le fais manuellement (en utilisant Ctrl + F9), donne les codes de champ qui ressemblent à ceci:

{ = 5 + { PAGE } } 

Et correctement produit des "6" à la page 1, "7" à la page 2, etc .. Peu importe ce que j'essaie, je ne peux pas reproduire ce type d'imbrication de champ en utilisant VBA. (L'enregistreur de macro est inutile ici). Quelqu'un peut-il trouver un moyen de créer ces champs par programmation?


Solution

Mon problème était que d'avoir PreserveFormatting:=True était de prendre le chemin de mes tentatives pour nicher un champ dans l'autre. Maintenant, la solution simple suivante fonctionne:

With storyRange.Find 
    .Text = "#POLICYPAGENO#" 
    .Wrap = 1 'wdFindContinue 
    .Execute 
    While .found 
     storyRange.Select 
     With oDoc.ActiveWindow 
      .Selection.Fields.Add Range:=.Selection.Range, Type:=-1, Text:="PAGE", PreserveFormatting:=False 
      .Selection.MoveLeft Unit:=1, Count:=1, Extend:=1 
      .Selection.Fields.Add Range:=.Selection.Range, Type:=-1, PreserveFormatting:=False 
      .Selection.TypeText Text:="= " & OverallPageNumber & " +" 
     End With 
     .Execute 
    Wend 
End With 

Répondre

1

Je suis assez sûr que votre méthode de Recherche et remplacement sélectionnerons le texte #OVERALLPAGENUMBER# chaque fois qu'il parcourt en boucle. Si tel est le cas, vous pouvez remplacer storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True avec ce qui suit, qui placez simplement votre code de champ obligatoire à la sélection actuelle:

Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="= 5 +" 
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="PAGE" 
Selection.Fields.Update 

Edit: Le code précédent ne fonctionne que si PreserveFormatting est réglé sur False. Il semble que Word met à jour un code de champ vide si PreserveFormatting est défini sur True. Vous pouvez naviguer dans la sélection pour conserver le formatage avec ce qui suit. Vous devriez seulement besoin de PreserveFormatting pour le champ externe.

Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=True 
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
Selection.Fields.ToggleShowCodes 
Selection.MoveLeft Unit:=wdCharacter, Count:=1 
Selection.MoveRight Unit:=wdCharacter, Count:=1 
Selection.TypeText Text:="= 5 +" 
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="PAGE" 
Selection.Fields.Update 
+0

Eh bien, ma méthode de recherche ne sélectionne pas automatiquement le texte, de sorte que cela ne fonctionne pas la chauve-souris. J'ai ensuite modifié votre code pour d'abord exécuter 'storyRange.Select' mais même alors, tout ce code a fini par faire était d'insérer deux champs vides autour du texte brut résultant de' {\ * MERGEFORMAT} = 5 + {\ * MERGEFORMAT} PAGE' – Alain

+0

Ok, vous avez juste besoin de déplacer le 'Selection' à l'intérieur du code de champ après que le premier champ ait été ajouté après votre' storyRange.Select'. C'est un peu dur sans voir votre document mais quelque chose comme 'Selection.MoveLeft Unit: = wdCharacter, Count: = 1'. Cela n'a peut-être pas marché à cause du '\ MERGEFORMAT', laissez-moi regarder. – CuberChase

+0

Veuillez voir la réponse mise à jour. Je crois que cela devrait fonctionner si vous utilisez 'storyRange.Select' maintenant. – CuberChase