Bagaimana cara memperbarui semua bidang dalam dokumen Word?

97

Saya ingin cara memperbarui semua bidang dalam dokumen Word 2013. (Jika berfungsi di versi lain, semuanya lebih baik; Saya awalnya memiliki masalah dengan Word 2007, dan sepertinya tidak ada yang berubah sejak saat itu.) Ini termasuk referensi silang, nomor halaman, daftar isi, indeks, header, dll. Jika itu dapat diperbarui dengan menekan F9, saya ingin itu diperbarui.

(Dalam bidang pembaruan teori dapat menyebabkan bidang lain perlu diperbarui, misalnya daftar isi yang lebih panjang mengubah beberapa nomor halaman dalam teks utama. Merawat kasus umum cukup baik untuk saya. Bahkan, tidak apa-apa jika saya harus menjalankan makro dua atau tiga kali sebelum stabil. Saya hanya ingin memiliki satu makro yang menemukan segalanya.)

Upaya saya sejauh ini tidak memperbarui bidang dalam kotak teks di dalam angka. Bagaimana cara saya memperbaruinya, dan apa lagi yang saya lewatkan?


EDIT : Menggabungkan jawaban yang diberikan dengan apa yang sudah saya miliki memberikan makro yang tampaknya memperbarui semuanya (dengan cacat yang diketahui ).

'' 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
sumber
1
Untuk kelengkapan, Anda mungkin juga ingin menambahkan tabel otoritas: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Terrance
Hanya kepala yang saya coba ini di Word 2013, dan mengonfirmasi bahwa itu masih berfungsi. Terima kasih banyak @Gilles untuk memberikan kode!
Ugo
Bagaimana dengan makro yang mencetak pratinjau dan kembali ke dokumen?
Pedro77
@ Pedro77 Bagaimana itu bisa membantu? Setidaknya dengan Word 2013 (saya tidak lagi memiliki akses ke Word 2007), pergi untuk mencetak pratinjau, atau dalam hal ini pencetakan, tidak memperbarui bidang.
Gilles
Bidang saya diperbarui, setidaknya referensi dan bidang referensi silang.
Pedro77

Jawaban:

37

Buka pengaturan cetak, pilih bidang pembaruan. Lalu pergi untuk mencetak, atau cetak pratinjau dokumen Anda.

Demikian juga, semua bidang diperbarui!

Opsi Cetak MS Word dari Word of Mac 2016

David Roussel
sumber
2
Bekerja untuk saya sekarang di Word 2010 (di mana pengaturannya ada di "File → Options → Display"). Bahkan tanpa opsi beberapa bidang diperbarui tetapi tidak semua. Saya cukup yakin itu tidak di Word 2007 tetapi saya tidak lagi harus menguji.
Gilles
2
Saya menggunakan Word 2016 untuk Mac. Pengaturan ada di Word -> Preferences -> Print. Tetapi pada janda itu akan di bagian cetak pengaturan global. Saya yakin saya pernah ke sana sebelumnya, tetapi saya belum menginstal untuk menguji dengan sekarang.
David Roussel
Saya kira ini tidak berfungsi lagi di Word 2016.
TCB13
Ini bekerja untuk saya di Word 2016 pada Windows 7.
bouvierr
Tidak berfungsi di Word 2016 Windows. Bidang dalam mis. Footer tidak diperbarui dengan benar.
Hobbes
80

Saya hanya melakukan Ctrl+ A- untuk memilih semuanya - dan kemudian F9 memperbarui banyak.

Meskipun, ini melewatkan header dan footer, tetapi mereka memperbarui ketika Anda mencetak / mencetak-pratinjau IIRC.


Memperbarui

Saya telah menemukan makro berikut. Pada tes cepat itu diperbarui daftar isi, bidang dalam paragraf, bidang dalam header dan footer, dan bidang dalam angka kotak teks mengambang.

Semoga itu mencakup semua yang Anda butuhkan, jika tidak harap tunjukkan apa yang masih gagal diperbarui.

Sumber: 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
sumber
@ Giles - OK, cukup adil, selalu yang terbaik untuk memeriksa bahwa dasar-dasarnya telah dieksplorasi terlebih dahulu. Saya baru saja berburu dan menemukan makro yang tampaknya melakukan pekerjaan itu, periksa pembaruan saya, beri tahu saya jika ada yang salah.
DMA57361
Sekarang kita bicara! Saya tidak tahu mengapa iterasi dengan NextStoryRangedan dengan document.StoryRangeshal-hal yang berbeda, tetapi kode Anda dikombinasikan dengan pembaruan tabel saya sudah membuat pemenang (well, hampir , tapi itu masalah yang berbeda).
Gilles
Ini tidak berfungsi untuk bidang yang ada di kotak teks yang terdapat di header / footer. Diperiksa pada Word 2016
slobo
5

Halaman ini terlihat menarik:

Jika Anda menggunakan Word 2007, prosesnya sedikit berbeda: Klik tombol Office dan kemudian klik Opsi Word. Word menampilkan kotak dialog Opsi Word. Klik Advanced di sisi kiri kotak dialog. (Klik di sini untuk melihat gambar terkait.) Di area Umum (gulir ke bawah sedikit untuk melihatnya), pastikan kotak centang Perbarui Tautan Otomatis di Buka dipilih. Klik OK. Pengaturan itu harus memastikan bahwa semua tautan Anda selalu terbarui. Jika Anda ingin memperbarui bidang saat dokumen dibuka, Anda harus menggunakan makro untuk menyelesaikan tugas. Khususnya, Anda harus menggunakan makro AutoOpen atau AutoClose, tergantung pada apakah Anda ingin memperbarui bidang ketika dokumen dibuka atau ditutup. Berikut ini adalah contoh makro AutoOpen yang dapat Anda gunakan.

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

Perhatikan bahwa makro memastikan bahwa opsi disetel untuk memaksa memperbarui bidang dan tautan saat pencetakan terjadi, kemudian memperbarui semua anggota koleksi Fields dalam dokumen. Sebaliknya, jika Anda ingin memperbarui bidang pada penutupan, Anda bisa menggunakan makro ini:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Makro ini jauh lebih pendek karena tidak perlu mengatur opsi pembaruan saat cetak saat Anda keluar dari dokumen. Keluar dari dokumen.


sumber
4

Word 2010:

Klik kanan pita, sesuaikan pita, pilih perintah dari "semua perintah", cari "perbarui" dan tambahkan di tempat yang Anda inginkan.

Tombol ini hanya memperbarui bidang yang dipilih.
Kemudian, untuk memperbarui semua bidang, tekan Ctrl+ Alalu tombol ini.

rlaviolette
sumber
Apa bedanya dengan menekan F9? Apakah itu benar-benar memperbarui angka, tabel, dll?
Gilles
1
Saya sekarang memiliki Word 2013, jadi saya memeriksa. Ini tampaknya melakukan hal yang sama seperti menekan F9. Itu tidak memperbarui bidang di dalam angka, yang merupakan motivasi utama saya untuk mengajukan pertanyaan ini.
Gilles
3

Jika Anda ingin memperbarui semua header dan footer dengan benar, ini berfungsi untuk saya:

    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
sumber
Bagaimana hal ini meningkatkan jawaban yang diterima ? Apakah itu memperbarui bidang dalam kotak teks dalam angka?
Gilles
2

Untuk 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.");
        }
    }
}
Pecahan
sumber