¿Cómo actualizo todos los campos en un documento de Word?

97

Quiero una forma de actualizar todos los campos en un documento de Word 2013. (Si funciona en otras versiones, mucho mejor; originalmente tuve este problema con Word 2007, y nada parece haber cambiado desde entonces). Esto incluye referencias cruzadas, números de página, tablas de contenido, índices, encabezados, etc. Si se puede actualizar presionando F9, quiero que se actualice.

(En teoría, la actualización de campos puede hacer que otros campos necesiten actualización, por ejemplo, una tabla de contenido más larga cambia algunos números de página en el texto principal. Cuidar los casos comunes es lo suficientemente bueno para mí. De hecho, está bien si tengo que ejecutar la macro dos o tres veces antes de que se estabilice. Solo quiero tener una sola macro que encuentre todo).

Mi intento hasta ahora no actualiza los campos en los cuadros de texto dentro de las figuras. ¿Cómo los actualizo y qué más me he perdido?


EDITAR : Al combinar la respuesta dada con lo que ya tenía, se obtiene una macro que parece actualizar todo (con un defecto conocido ).

'' 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
Gilles
fuente
1
Para completar, es posible que también desee agregar la tabla de autoridades: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Terrance
Solo un aviso de que probé esto en Word 2013 y confirmó que todavía funciona. ¡Muchas gracias @Gilles por proporcionar el código!
Ugo
¿Qué pasa con una macro que va a la vista previa de impresión y vuelve al documento?
Pedro77
@ Pedro77 ¿Cómo se supone que eso ayudará? Al menos con Word 2013 (ya no tengo acceso a Word 2007), ir a la vista previa de impresión o, de hecho, imprimir, no actualiza los campos.
Gilles
Mis campos están actualizados, al menos referencias y campos de referencias cruzadas.
Pedro77

Respuestas:

37

Vaya a la configuración de impresión, seleccione los campos de actualización. Luego, vaya a imprimir o imprima una vista previa de su documento.

Et voilà, todos los campos están actualizados!

Opciones de impresión de MS Word de Word of Mac 2016

David Roussel
fuente
2
Trabajando para mí ahora en Word 2010 (donde la configuración está en "Archivo → Opciones → Pantalla"). De hecho, sin la opción, algunos campos se actualizan pero no todos. Estoy bastante seguro de que no lo hizo en Word 2007, pero ya no lo tengo para probar.
Gilles
2
Estoy en Word 2016 para Mac. La configuración está en Word -> Preferencias -> Imprimir. Pero en las viudas lo hará en la sección de impresión de la configuración global. Estoy seguro de que he estado allí en el pasado, pero no tengo una instalación para probar en este momento.
David Roussel
Supongo que esto ya no funciona en Word 2016.
TCB13
Esto funcionó para mí en Word 2016 en Windows 7.
bouvierr
No funciona en Word 2016 Windows. Los campos en, por ejemplo, los pies de página no se actualizan correctamente.
Hobbes
80

Simplemente hago Ctrl+ A- para seleccionar todo - y luego F9 para actualizar el lote.

Sin embargo, esto pierde encabezados y pies de página, pero se actualizan cuando imprime / imprime-previsualiza IIRC.


Actualizar

He encontrado la siguiente macro. En una prueba rápida, actualizó tablas de contenido, campos dentro de párrafos, campos dentro del encabezado y pie de página, y campos dentro de una figura de cuadro de texto flotante.

Esperemos que eso cubra todo lo que necesita, si no, indique lo que aún no se puede actualizar.

Fuente: http://www.gmayor.com/installing_macro.htm

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
DMA57361
fuente
@Giles: OK, lo suficientemente justo, siempre es mejor verificar que lo básico se haya explorado primero. Acabo de tener una búsqueda y encontré una macro que parece hacer el trabajo, verifique mi actualización, avíseme si falta algo.
DMA57361
¡Ahora estamos hablando! No tengo idea de por qué iterar con NextStoryRangey con document.StoryRangesson cosas diferentes, pero su código combinado con las actualizaciones de la tabla ya tenía un ganador (bueno, casi , pero ese es un problema diferente).
Gilles
Esto no funciona para campos contenidos en cuadros de texto contenidos en el encabezado / pie de página. Comprobado en Word 2016
slobo
5

Esta página se ve interesante:

Si está utilizando Word 2007, el proceso es un poco diferente: haga clic en el botón de Office y luego en Opciones de Word. Word muestra el cuadro de diálogo Opciones de Word. Haga clic en Avanzado en el lado izquierdo del cuadro de diálogo. (Haga clic aquí para ver una figura relacionada). En el área General (desplácese un poco hacia abajo para verla), asegúrese de que la casilla Actualizar enlaces automáticos al abrir esté seleccionada. Haga clic en OK Esa configuración debe garantizar que todos sus enlaces estén siempre actualizados. Si desea actualizar los campos cuando se abre el documento, deberá utilizar una macro para realizar la tarea. Específicamente, necesitará usar una macro AutoOpen o AutoClose, dependiendo de si desea actualizar los campos cuando el documento se abre o se cierra. El siguiente es un ejemplo de una macro AutoOpen que puede usar.

Sub AutoOpen()
    With Options
        .UpdateFieldsAtPrint = True
        .UpdateLinksAtPrint = True
    End With
    ActiveDocument.Fields.Update
End Sub

Tenga en cuenta que la macro se asegura de que las opciones estén configuradas para forzar la actualización de los campos y enlaces cuando se produce la impresión, luego actualiza a todos los miembros de la colección Campos en el documento. Si, en cambio, desea actualizar los campos al cierre, puede usar esta macro:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Esta macro es mucho más corta porque no hay necesidad de configurar las opciones de actualización en impresión cuando sale del documento.


fuente
4

Word 2010:

Haga clic con el botón derecho en la cinta, personalícela, elija el comando de "todos los comandos", busque "actualizar" y agréguela donde desee.

Este botón actualiza solo los campos seleccionados.
Luego, para actualizar todos los campos, presione Ctrl+ y Aluego este botón.

rlaviolette
fuente
¿Cómo se diferencia de presionar F9? ¿Eso realmente se actualiza dentro de figuras, tablas, etc.?
Gilles
1
Ahora tengo Word 2013, así que lo comprobé. Esto parece hacer lo mismo que presionar F9. No actualiza los campos dentro de las figuras, que fue mi principal motivación para hacer esta pregunta.
Gilles
3

Si desea actualizar correctamente todos los encabezados y pies de página, esto funcionó para mí:

    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
Yohnny
fuente
¿Cómo mejora esto en la respuesta aceptada ? ¿Actualiza campos en cuadros de texto en figuras?
Gilles
2

Para 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.");
        }
    }
}
fragmento
fuente