Je veux un moyen de mettre à jour tous les champs d'un document Word 2013. (Si cela fonctionne dans d'autres versions, tant mieux; j'avais à l'origine ce problème avec Word 2007 et rien ne semble avoir changé depuis.) Cela comprend les références croisées, les numéros de page, les tables des matières, les index, les en-têtes, etc. S'il peut être mis à jour en appuyant sur F9Je veux le mettre à jour.
(En théorie, la mise à jour des champs peut nécessiter une mise à jour, par exemple, une table des matières plus longue modifie certains numéros de page dans le texte principal. Prendre soin des cas courants me suffit. En fait, je peux exécuter le processus. la macro deux ou trois fois avant qu'elle ne se stabilise. Je veux juste avoir une seule macro qui trouve tout.)
Ma tentative jusqu'à présent ne met pas à jour les champs dans les zones de texte à l'intérieur des figures. Comment puis-je les mettre à jour et quoi d'autre ai-je manqué?
EDIT: En combinant la réponse donnée avec ce que j'avais déjà, on obtient une macro qui semble tout mettre à jour (avec un défaut conn =).
'' Update all the fields, indexes, etc. in the specified document.
Sub UpdateAllFieldsIn(doc As Document)
'' Update tables. We do this first so that they contain all necessary
'' entries and so extend to their final number of pages.
Dim toc As TableOfContents
For Each toc In doc.TablesOfContents
toc.Update
Next toc
Dim tof As TableOfFigures
For Each tof In doc.TablesOfFigures
tof.Update
Next tof
'' Update fields everywhere. This includes updates of page numbers in
'' tables (but would not add or remove entries). This also takes care of
'' all index updates.
Dim sr As range
For Each sr In doc.StoryRanges
sr.Fields.Update
While Not (sr.NextStoryRange Is Nothing)
Set sr = sr.NextStoryRange
'' FIXME: for footnotes, endnotes and comments, I get a pop-up
'' "Word cannot undo this action. Do you want to continue?"
sr.Fields.Update
Wend
Next sr
End Sub
'' Update all the fields, indexes, etc. in the active document.
'' This is a parameterless subroutine so that it can be used interactively.
Sub UpdateAllFields()
UpdateAllFieldsIn ActiveDocument
End Sub
Je fais juste Ctrl+A - pour tout sélectionner - et puis F9 mettre à jour le lot.
Bien que cela manque des en-têtes et des pieds de page, mais ils sont mis à jour lorsque vous imprimez/affichez un aperçu avant impression.
J'ai trouvé la macro suivante. Lors d'un test rapide, il a mis à jour des tables des matières, des champs dans des paragraphes, des champs dans l'en-tête et le pied de page et des champs dans une figure de zone de texte flottante.
Espérons que cela couvre tout ce dont vous avez besoin, sinon indiquez ce qui ne fonctionne toujours pas.
Sub UpdateAll()
Dim oStory As Range
For Each oStory In ActiveDocument.StoryRanges
oStory.Fields.Update
If oStory.StoryType <> wdMainTextStory Then
While Not (oStory.NextStoryRange Is Nothing)
Set oStory = oStory.NextStoryRange
oStory.Fields.Update
Wend
End If
Next oStory
Set oStory = Nothing
End Sub
Cette page semble intéressante:
Si vous utilisez Word 2007, le processus est un peu différent: cliquez sur le bouton Office, puis sur Options Word. Word affiche la boîte de dialogue Options Word. Cliquez sur Avancé à gauche de la boîte de dialogue. (Cliquez ici pour afficher une figure associée.) Dans la zone Général (défilez un peu pour la voir), assurez-vous que la case à cocher Mettre à jour les liens automatiques à l'ouverture est cochée. Cliquez sur OK Ce paramètre doit vous assurer que tous vos liens sont toujours à jour. Si vous souhaitez mettre à jour les champs lorsque le document est ouvert, vous devez utiliser une macro pour accomplir la tâche. Plus précisément, vous devrez utiliser une macro AutoOpen ou AutoClose, selon que vous souhaitez ou non mettre à jour les champs à l'ouverture ou à la fermeture du document. Voici un exemple de macro AutoOpen que vous pouvez utiliser.
Sub AutoOpen()
With Options
.UpdateFieldsAtPrint = True
.UpdateLinksAtPrint = True
End With
ActiveDocument.Fields.Update
End Sub
Notez que la macro s'assure que les options sont définies pour forcer la mise à jour des champs et des liens lors de l'impression, puis met à jour tous les membres de la collection Fields du document. Si vous préférez mettre à jour les champs à la fermeture, vous pouvez utiliser cette macro:
Sub AutoClose()
ActiveDocument.Fields.Update
End Sub
Cette macro est beaucoup plus courte car il n'est pas nécessaire de définir les options de mise à jour à l'impression lorsque vous quittez le document.
Si vous souhaitez mettre à jour correctement tous les en-têtes et les pieds de page, cela a fonctionné pour moi:
Dim oStory As Range
Dim oSection As Object
Dim oHeader As Object
Dim oFooter As Object
For Each oStory In ActiveDocument.StoryRanges
oStory.Fields.Update
Next oStory
For Each oSection In ActiveDocument.Sections
For Each oHeader In oSection.Headers
oHeader.Range.Fields.Update
Next oHeader
For Each oFooter In oSection.Footers
oFooter.Range.Fields.Update
Next oFooter
Next oSection
Word 2010:
Cliquez avec le bouton droit sur le ruban, personnalisez-le, choisissez une commande dans "toutes les commandes", recherchez "mise à jour" et ajoutez-la à l'endroit souhaité.
Ce bouton met à jour uniquement les champs sélectionnés.
Ensuite, pour mettre à jour tous les champs, appuyez sur Ctrl + A alors ce bouton.
Pour C #:
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Office.Interop.Word;
class Program
{
static void Main(string[] args)
{
List<string> path = new List<string>(args);
string filePathstr = string.Join(" ", path.ToArray());
//System.Windows.Forms.MessageBox.Show("filepathstr: " + filePathstr);
string folderPathstr = Path.GetDirectoryName(filePathstr);
//System.Windows.Forms.MessageBox.Show("folderPathstr: " + folderPathstr);
try
{
Application ap = new Application();
Document document = ap.Documents.Open(filePathstr);
document.Fields.Update();
foreach (Section section in document.Sections)
{
document.Fields.Update(); // update each section
HeadersFooters headers = section.Headers; //Get all headers
foreach (HeaderFooter header in headers)
{
Fields fields = header.Range.Fields;
foreach (Field field in fields)
{
field.Update(); // update all fields in headers
}
}
HeadersFooters footers = section.Footers; //Get all footers
foreach (HeaderFooter footer in footers)
{
Fields fields = footer.Range.Fields;
foreach (Field field in fields)
{
field.Update(); //update all fields in footers
}
}
}
document.Save();
document.Close();
}
catch (NullReferenceException)
{
System.Windows.Forms.MessageBox.Show("A valid file was not selected.");
}
}
}