Làm cách nào để cập nhật tất cả các trường trong tài liệu Word?


97

Tôi muốn một cách cập nhật tất cả các trường trong tài liệu Word 2013. (Nếu nó hoạt động trong các phiên bản khác, thì tốt hơn; ban đầu tôi gặp vấn đề với Word 2007 và dường như không có gì thay đổi kể từ đó.) Nếu nó có thể được cập nhật bằng cách nhấn F9, tôi muốn nó được cập nhật.

(Về lý thuyết, các trường cập nhật có thể khiến các trường khác cần cập nhật, ví dụ: mục lục dài hơn sẽ thay đổi một số số trang trong văn bản chính. Chăm sóc các trường hợp phổ biến là đủ tốt đối với tôi. macro hai hoặc ba lần trước khi nó ổn định. Tôi chỉ muốn có một macro tìm thấy mọi thứ.)

Nỗ lực của tôi cho đến nay không cập nhật các trường trong hộp văn bản bên trong các hình. Làm cách nào để cập nhật chúng, và tôi còn bỏ lỡ điều gì nữa không?


EDIT : Kết hợp câu trả lời được đưa ra với những gì tôi đã có cho một macro dường như cập nhật mọi thứ (với một khiếm khuyết đã biết ).

'' 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

1
Để hoàn thiện, bạn cũng có thể muốn thêm bảng chính quyền: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Terrance

Chỉ cần một cái đầu lên là tôi đã thử cái này trong Word 2013 và xác nhận rằng nó vẫn hoạt động. Cảm ơn bạn rất nhiều @Gilles đã cung cấp mã!
Ugo

Điều gì về một macro đi in xem trước và trở lại tài liệu?
Pedro77

@ Pedro77 Làm thế nào để giúp đỡ? Ít nhất là với Word 2013 (tôi không còn có quyền truy cập vào Word 2007), sẽ in bản xem trước hoặc cho vấn đề in đó, không cập nhật các trường.
Gilles

Các trường của tôi được cập nhật, ít nhất là các tham chiếu và các trường tham chiếu chéo.
Pedro77

Câu trả lời:


37

Đi vào cài đặt in, chọn trường cập nhật. Sau đó đi đến in, hoặc in xem trước tài liệu của bạn.

Et voilà, tất cả các lĩnh vực được cập nhật!

Tùy chọn in MS Word từ Word của Mac 2016


2
Hiện đang làm việc với tôi trong Word 2010 (trong đó cài đặt nằm trong Tệp Tệp → Tùy chọn → Hiển thị,). Trong thực tế không có tùy chọn, một số lĩnh vực được cập nhật nhưng không phải tất cả. Tôi khá chắc chắn rằng nó không có trong Word 2007 nhưng tôi không còn phải thử nghiệm nữa.
Gilles

2
Tôi đang dùng Word 2016 cho Mac. Cài đặt nằm trong Word -> Tùy chọn -> In. Nhưng trên góa phụ, nó sẽ nằm trong phần in của cài đặt toàn cầu. Tôi chắc chắn rằng tôi đã từng ở đó trong quá khứ, nhưng tôi không có cài đặt để kiểm tra ngay bây giờ.
David Roussel

Tôi đoán điều này không còn hoạt động nữa trên Word 2016.
TCB13

Điều này làm việc cho tôi trong Word 2016 trên Windows 7.
bouvierr

Không hoạt động trong Windows 2016 Windows. Các trường trong ví dụ chân trang không được cập nhật chính xác.
Hobbes

80

Tôi chỉ làm Ctrl+ A- để chọn mọi thứ - và sau đó F9 cập nhật nhiều.

Mặc dù, điều này bỏ lỡ các tiêu đề và chân trang, nhưng chúng cập nhật khi bạn in / in-xem trước IIRC.


Cập nhật

Tôi đã tìm thấy macro sau. Trong một thử nghiệm nhanh, nó đã cập nhật các bảng nội dung, các trường trong đoạn văn, các trường trong đầu trang và chân trang và các trường trong một hình hộp văn bản nổi.

Hy vọng rằng nó bao gồm tất cả mọi thứ bạn cần, nếu không xin vui lòng cho biết những gì vẫn không cập nhật.

Nguồn: 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

@Giles - OK, đủ công bằng, luôn luôn tốt nhất để kiểm tra xem những điều cơ bản đã được khám phá trước tiên. Tôi vừa mới đi săn và tìm thấy một macro dường như thực hiện công việc, kiểm tra cập nhật của tôi, cho tôi biết nếu nó bỏ lỡ bất cứ điều gì.
DMA57361

Bây giờ chúng ta nói chuyện! Tôi không biết tại sao lặp lại với NextStoryRangevà với document.StoryRangesnhững thứ khác nhau, nhưng mã của bạn kết hợp với các bản cập nhật bảng tôi đã tạo nên một người chiến thắng (tốt, hầu như , nhưng đó là một vấn đề khác).
Gilles

Điều này không hoạt động đối với các trường có trong hộp văn bản chứa trong đầu trang / chân trang. Đã kiểm tra trên Word 2016
slobo

5

Đây trang trông thú vị:

Nếu bạn đang sử dụng Word 2007, quy trình sẽ hơi khác một chút: Nhấp vào nút Office và sau đó nhấp vào Tùy chọn Word. Word hiển thị hộp thoại Tùy chọn Word. Nhấp vào Nâng cao ở bên trái của hộp thoại. (Bấm vào đây để xem hình liên quan.) Trong khu vực Chung (cuộn xuống một chút để xem nó), đảm bảo hộp kiểm Cập nhật liên kết tự động khi mở được chọn. Bấm vào OK. Cài đặt đó phải đảm bảo rằng tất cả các liên kết của bạn luôn được cập nhật. Nếu bạn muốn cập nhật các trường khi tài liệu được mở, bạn sẽ cần sử dụng macro để hoàn thành nhiệm vụ. Cụ thể, bạn sẽ cần sử dụng macro AutoOpen hoặc AutoC Đóng, tùy thuộc vào việc bạn muốn cập nhật các trường khi tài liệu mở hay đóng. Sau đây là một ví dụ về macro AutoOpen bạn có thể sử dụng.

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

Lưu ý rằng macro đảm bảo rằng các tùy chọn được đặt để buộc cập nhật các trường và liên kết khi in xảy ra, sau đó nó sẽ cập nhật tất cả các thành viên của bộ sưu tập Trường trong tài liệu. Thay vào đó, nếu bạn muốn cập nhật các trường lúc đóng, bạn có thể sử dụng macro này:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Macro này ngắn hơn nhiều vì không cần thiết lập các tùy chọn cập nhật khi in khi bạn thoát tài liệu. Xuất hiện tài liệu.


4

Lời 2010:

Nhấp chuột phải vào ruy băng, tùy chỉnh ruy băng, chọn lệnh từ "tất cả các lệnh" tìm kiếm "cập nhật" và thêm nó vào nơi bạn muốn.

Nút này chỉ cập nhật các trường đã chọn.
Sau đó, để cập nhật tất cả các trường, nhấn Ctrl+ Arồi nút này.


Làm thế nào để nó khác với nhấn F9? Điều đó thực sự cập nhật bên trong số liệu, bảng, vv?
Gilles

1
Bây giờ tôi có Word 2013, vì vậy tôi đã kiểm tra. Điều này dường như làm tương tự như nhấn F9. Nó không cập nhật các trường bên trong các số liệu, đó là động lực chính của tôi khi đặt câu hỏi này.
Gilles

3

Nếu bạn muốn cập nhật chính xác tất cả các tiêu đề và chân trang, điều này làm việc cho tôi:

    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

Làm thế nào để cải thiện câu trả lời được chấp nhận ? Nó có cập nhật các trường trong hộp văn bản trong hình không?
Gilles

2

Đối với 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.");
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.