تیم یک ماکرو ساده برای به روز رسانی تمام فیلدهای یک الگو ایجاد کرد. ماکرو شامل مرحله ای است که کل سند را انتخاب می کند، مانند فشار دادن Ctrl+A. این مرحله سرصفحهها و پاورقیها را انتخاب نمیکند و تیم میترسد که ممکن است فیلدهایی برای بهروزرسانی در آن مکانها وجود داشته باشد. او فکر میکند که آیا راهی برای اضافه کردن سرصفحهها و پاورقیها در هنگام انتخاب همه وجود دارد یا اینکه آیا روش دیگری برای آن وجود دارد. ماکرو خود را برای به روز رسانی فیلدها در قسمت سرصفحه یا پاورقی.
پاسخ ساده این است که شما باید کد ماکرو خود را به گونهای تغییر دهید که در تمام قسمتهای مختلف Word به نظر برسد که ممکن است فیلدهایی وجود داشته باشد. مشکل استفاده از روش "انتخاب همه" این است که فقط متن را در سند اصلی انتخاب می کند. سرصفحه ها، پاورقی ها و تعداد زیادی از عناصر دیگر در لایه های جداگانه خود نگهداری می شوند که مانع از انتخاب آنها با تمام متن سند می شود.
اگر به سادگی می خواهید فیلدها را در متن اصلی و در سرصفحه ها و پاورقی ها به روز کنید، باید از تکنیکی مانند زیر استفاده کنید:
Sub MyUpdateFields1()
ActiveDocument.StoryRanges(wdMainTextStory).Fields.Update
ActiveDocument.StoryRanges(wdPrimaryFooterStory).Fields.Update
ActiveDocument.StoryRanges(wdPrimaryHeaderStory).Fields.Update
End Sub
توجه داشته باشید که لایه های مختلف یک سند به عنوان "داستان" نامیده می شوند و در مجموعه خود نگهداری می شوند. در حالی که این ماکرو ساده به سرعت فیلدهای داستان های حاوی متن اصلی، پاورقی ها و سرصفحه ها را به روز می کند، داستان های دیگری (لایه ها) وجود دارد که ممکن است فیلدهایی وجود داشته باشد که نیاز به به روز رسانی دارند. ماکرو زیر هر داستان را صرف نظر از نوع آن بررسی می کند و به روز رسانی لازم را انجام می دهد:
Sub MyUpdateFields2()
Dim story As Word.Range
For Each story In ActiveDocument.StoryRanges
Do
story.Fields.Update
" Check linked stories as linked stories are not independent
Set story = story.NextStoryRange
Loop Until (story Is Nothing)
Next
End Sub
با این حال، اگر واقعاً میخواهید کامل باشید، چیزی بیش از لایههای داستانی مختلف وجود دارد که باید از طریق آنها نگاه کنید. به عنوان مثال، ممکن است برخی از فیلدها در جعبه های متنی وجود داشته باشد که نیاز به به روز رسانی دارند. یک کلان جامعتر برای مقابله با همه این مکانهای دیگر که میتوان فیلدها را پیدا کرد، مورد نیاز است. در مثال زیر، به عناصر مختلف سند که میتوان آنها را برای فیلدها بررسی کرد، توجه کنید.
Sub MyUpdateFields3()
Dim doc As Document " Pointer to Active Document
Dim wnd As Window " Pointer to Document"s Window
Dim lngMain As Long " Main Pane Type Holder
Dim lngSplit As Long " Split Type Holder
Dim lngActPane As Long " ActivePane Number
Dim rngStory As Range " Range Objwct for Looping through Stories
Dim TOC As TableOfContents " Table of Contents Object
Dim TOA As TableOfAuthorities "Table of Authorities Object
Dim TOF As TableOfFigures "Table of Figures Object
Dim shp As Shape
" Set Objects
Set doc = ActiveDocument
Set wnd = ActiveDocument.ActiveWindow
" get Active Pane Number
lngActPane = wnd.ActivePane.Index
" Hold View Type of Main pane
lngMain = wnd.Panes(1).View.Type
" Hold SplitSpecial
lngSplit = wnd.View.SplitSpecial
" Get Rid of any split
wnd.View.SplitSpecial = wdPaneNone
" Set View to Normal
wnd.View.Type = wdNormalView
" Loop through each story in doc to update
For Each rngStory In doc.StoryRanges
If rngStory.StoryType = wdCommentsStory Then
Application.DisplayAlerts = wdAlertsNone
" Update fields
rngStory.Fields.Update
Application.DisplayAlerts = wdAlertsAll
Else
" Update fields
rngStory.Fields.Update
End If
Next
For Each shp In doc.Shapes
With shp.TextFrame
If .HasText Then
shp.TextFrame.TextRange.Fields.Update
End If
End With
Next
" Loop through TOC and update
For Each TOC In doc.TablesOfContents
TOC.Update
Next
" Loop through TOA and update
For Each TOA In doc.TablesOfAuthorities
TOA.Update
Next
" Loop through TOF and update
For Each TOF In doc.TablesOfFigures
TOF.Update
Next
" Return Split to original state
wnd.View.SplitSpecial = lngSplit
" Return main pane to original state
wnd.Panes(1).View.Type = lngMain
" Active proper pane
wnd.Panes(lngActPane).Activate
" Close and release all pointers
Set wnd = Nothing
Set doc = Nothing
End Sub