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
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
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
Veuillez voir la réponse mise à jour. Je crois que cela devrait fonctionner si vous utilisez 'storyRange.Select' maintenant. – CuberChase