سؤال كيف يمكنني تحديث كل الحقول في مستند Word؟


اريد طريقة للتحديث الكل الحقول في مستند Word 2013. (إذا كان يعمل في إصدارات أخرى ، فكلما كان ذلك أفضل ؛ لقد واجهت هذه المشكلة مع Word 2007 أصلاً ، ولا يبدو أن شيئًا قد تغير منذ ذلك الحين). يشمل ذلك المراجع التبادلية وأرقام الصفحات وجداول المحتويات والفهارس والرؤوس وما إلى ذلك. إذا كان يمكن تحديثها عن طريق الضغط F9، أريد تحديثه.

(من الناحية النظرية ، يمكن أن تتسبب الحقول في تحديث الحقول الأخرى بحاجة للتحديث ، على سبيل المثال ، يتغير جدول المحتويات الطويل بعض أرقام الصفحات في النص الرئيسي ، فالاعتناء بالحالات الشائعة جيد بما يكفي بالنسبة لي. الماكرو مرتين أو ثلاث مرات قبل أن يستقر.أريد فقط أن يكون لديك ماكرو واحد يجد كل شيء.)

محاولتي حتى الآن لا تقوم بتحديث الحقول في مربعات النص داخل الأشكال. كيف يمكنني تحديثها وماذا فاتني؟


تصحيح: الجمع بين الإجابة المعطاة مع ما سبق أن أعطيت ماكرو يبدو لتحديث كل شيء (مع عيب معروف).

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

88
2017-10-06 20:29


الأصل


للتأكد من اكتمالها ، قد ترغب أيضًا في إضافة جدول السلطات: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next - Terrance
لقد قمت بتجربة هذا في Word 2013 ، وأكدت أنه لا يزال يعمل. شكرًا جزيلاًGilles لتقديم الرمز! - Ugo
ماذا عن الماكرو الذي يذهب إلى معاينة الطباعة والعودة إلى المستند؟ - Pedro77
@ Pedro77 كيف هو أن من المفترض أن يساعد؟ على الأقل مع Word 2013 (لم يعد بإمكاني الوصول إلى Word 2007) ، فإن الانتقال إلى معاينة الطباعة ، أو للطباعة ذات الصلة ، لا يقوم بتحديث الحقول. - Gilles
يتم تحديث حقولي ، على الأقل المراجع وحقول المرجع التبادلي. - Pedro77


الأجوبة:


الذهاب إلى إعدادات الطباعة ، حدد حقول التحديث. ثم انتقل للطباعة ، أو اطبع المستند الخاص بك.

Et voilà ، يتم تحديث جميع المجالات!

MS Word Print Options from Word of Mac 2016


32
2017-09-15 13:27



العمل بالنسبة لي الآن في Word 2010 (حيث يكون الإعداد في "File → Options → Display"). في الواقع دون هذا الخيار بعض يتم تحديث الحقول ولكن ليس كلها. أنا متأكد من أنه لم يكن في Word 2007 ولكن لم يعد لدي اختبار. - Gilles
أنا على Word 2016 لنظام التشغيل Mac. يكون الإعداد في Word -> التفضيلات -> طباعة. ولكن على الأرامل ، ستظهر في قسم الطباعة في الإعدادات العامة. أنا متأكد من أنني كنت هناك في الماضي ، ولكن ليس لدي تثبيت لاختباره الآن. - David Roussel
أعتقد أن هذا لم يعد يعمل على Word 2016. - TCB13
لقد عمل هذا بالنسبة لي في Word 2016 على Windows 7. - bouvierr
لا يعمل في Word 2016 Windows. الحقول على سبيل المثال لا يتم تحديث التذييلات بشكل صحيح. - Hobbes


أنا فقط أفعل السيطرة+ا - لتحديد كل شيء - و ثم  F9 لتحديث الكثير.

على الرغم من أن هذا يفتقد رؤوس الصفحات وتذييلاتها ، إلا أنه يتم تحديثها عند طباعة IIRC / print-preview.


تحديث

لقد وجدت الماكرو التالي. في اختبار سريع قام بتحديث جداول المحتويات ، والحقول داخل الفقرات ، والحقول داخل الرأس والتذييل ، والحقول داخل شكل مربع نص عائم.

نأمل أن تغطي كل ما تحتاجه ، إن لم يكن من فضلك ، يرجى الإشارة إلى ما لا يزال غير قادر على التحديث.

مصدر: 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

78
2017-10-06 21:07



Giles - حسنًا وعادلًا بما فيه الكفاية ، من الأفضل دائمًا التحقق من استكشاف الأساسيات أولاً. لقد حصلت الآن على عملية بحث ووجدت ماكرو يبدو أنه يؤدي المهمة ، تحقق من تحديثي ، أخبرني إذا فاتته أي شيء. - DMA57361
هذا هو المطلوب! ليس لدي أي فكرة لماذا تتحدث مع NextStoryRange ومع document.StoryRanges أشياء مختلفة ، لكن كودك مدمجًا مع تحديثات الجدول الذي سبق لي أن صنعته فائزًا (حسناً ، تقريبيا، لكن هذه قضية مختلفة). - Gilles


هذه صفحة يبدوا مثيرا للأهتمام:

إذا كنت تستخدم Word 2007 ، فإن   عملية مختلفة بعض الشيء: انقر فوق   انقر فوق زر Office ثم انقر فوق Word   خيارات. يعرض Word كلمة   مربع حوار الخيارات. انقر فوق متقدم   على الجانب الأيسر من مربع الحوار.   (انقر هنا لرؤية شخصية ذات صلة.)   في المجال العام (قم بالتمرير لأسفل قليلاً   لرؤيتها) ، تأكد من التحديث   الارتباطات التلقائية عند الفتح هي خانة الاختيار   المحدد. انقر فوق موافق. هذا الإعداد   يجب التأكد من أن جميع الروابط الخاصة بك   هي دائما ما يصل إلى التاريخ. أذا أردت   تحديث الحقول عندما يكون المستند   فتح ، ستحتاج إلى استخدام ماكرو ل   إنجاز المهمة. على وجه التحديد،   ستحتاج إلى استخدام AutoOpen   أو ماكرو AutoClose ، بناءً على   ما إذا كنت تريد تحديث الحقول   عند فتح المستند أو إغلاقه. ال   فيما يلي مثال على AutoOpen   ماكرو يمكنك استخدامها.

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

لاحظ أن الماكرو يتأكد   أن يتم تعيين الخيارات لفرض   تحديث الحقول والروابط عندما   يحدث الطباعة ، ثم يقوم بتحديث كل شيء   أعضاء مجموعة الحقول   في المستند. إذا كنت ، بدلا من ذلك ،   يريد تحديث الحقول في   إغلاق ، يمكنك استخدام هذا الماكرو:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

هذا الماكرو هو أقصر بكثير لأن   ليست هناك حاجة لضبط   خيارات التحديث عند الطباعة عندما تكون   الخروج من الوثيقة.


5
2017-10-07 02:18





إذا كنت تريد تحديث جميع رؤوس الصفحات وتذييلاتها بشكل صحيح ، فقد نجحت في ذلك:

    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

3
2018-02-18 19:32



كيف تحسن هذا على الإجابة المقبولة؟ هل يقوم بتحديث الحقول في مربعات النص بالأرقام؟ - Gilles


كلمة 2010:

انقر بزر الماوس الأيمن على الشريط ، وقم بتخصيص الشريط ، واختر الأمر من "جميع الأوامر" ابحث عن "تحديث" وأضفه إلى المكان الذي تريده.

يقوم هذا الزر بتحديث الحقول المحددة فقط.
ثم ، لتحديث جميع الحقول ، اضغط السيطرة + ا ثم هذا الزر.


2
2017-07-18 19:24



كيف تختلف عن الضغط F9؟ هل هذا حقا تحديث داخل الأرقام والجداول ، وما إلى ذلك؟ - Gilles
لدي الآن Word 2013 ، لذلك راجعت. هذا يبدو أن تفعل نفس الضغط على F9. لا يقوم بتحديث الحقول داخل الأشكال ، وهو الدافع الرئيسي لطرح هذا السؤال. - Gilles


بالنسبة لـ 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.");
        }
    }
}

2
2018-06-15 20:59