可以在受保护的Word文档上使用Fields.ToggleShowCodes吗?

时间:2016-01-09 02:59:06

标签: vba word-vba

我有一个支持宏的Word文档(.docm)并且正在使用Word 2007。

一个宏将“强烈参考”样式应用于所有交叉引用。

我正在尝试使用Fields.ToggleShowCodes在搜索引用之前显示字段。

问题是这只适用于文档未受保护的情况。当文档受到保护时,有没有办法做到这一点?

我有一个解决方法;我可以使用SendKeys("%{F9}")按ALT + F9。这有效,但很难看。我真的很挑剔,但我认为可能有更好的方法。

编辑:

对于某些背景:这是修订控制文档的模板。保护限制了可以使用的样式并锁定了文档的各个部分,例如:页眉和页脚,包含文档属性和修订历史记录。使用表单输入这些属性(许多是自定义属性)。主文本的可编辑部分是作为适用于每个人的例外实现的 - 这是交叉引用的位置。

编辑2:

这是代码(减去CharFormat宏,这是不相关的):

Sub InitUpdate()
'
' InitUpdate Macro - shows field codes (ALT+F9), waits 1ms (to allow for
'   key presses), then calls the ExecUpdate macro.
'   Used at the start of the Update Refs procedure.
'
SendKeys "%{F9}"

Application.OnTime When:=Now + 0.001, Name:="ExecUpdate"

End Sub

Sub IntenseRef()
'
' IntenseRef Macro - changes all cross references to
'   'intense reference' style (bold and blue text).
'   Used in Update Refs procedure.
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("Intense Reference")

With Selection.Find
    .Text = "^19 REF"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With

' Replace method causes an error if it runs before the active doc. has been
'   clicked (i.e. when the file is first opened) or header/footer editing mode
'   is enabled.
On Error GoTo ErrHandler
    Selection.Find.Execute Replace:=wdReplaceAll
    Exit Sub

ErrHandler:
    If Err <> 0 Then
        MsgBox ("Select anywhere in the main text first...")
        Err.Clear
    End If

End Sub

Sub ExecUpdate()
'
' ExecUpdate Macro - changes reference styles.
'   Field codes are then hidden (ALT+F9) and the fields are updated.
'   Used in Update Refs procedure (final part).
'
CharFormat
IntenseRef

SendKeys "%{F9}"
ActiveDocument.Fields.Update

End Sub

编辑3:

在代码中添加了注释,解释了错误处理程序的必要性。

1 个答案:

答案 0 :(得分:0)

“定位”字段代码有很多可能性。我相信我在测试中复制了你的保护设置......

  1. 最近你用过的方法:

    ActiveWindow.View.ShowFieldCodes = True'False将其关闭

  2. 就我个人而言,我不喜欢在屏幕上,在用户面前更换内容,除非没有其他方法可以完成任务,或者除非它在速度上有明显的差异。这意味着我尽可能使用Range对象而不是Selection。 Range对象具有一个属性,允许您访问字段代码,即使它们未显示:Range.TextRetrievalMode.IncludeFieldCodes。但是你也应该使用Range而不是Selection的Selection。

  3. 为了帮助您入门:

    Dim rng As word.Range
    Set rng = ActiveDocument.content
    rng.TextRetrievalMode.IncludeFieldCodes = True
    With rng.Find
        'And so on, as you already have
    

    Range.Find和Selection.Find之间的另一个区别是后者的设置会影响UI中的对话框,而使用Range.Find不会更改对话框。

    1. 不使用Find,而是循环文档中的Fields集合,检查Field.Type,如果是REF字段,则应用样式。
    2. 这些方面的东西:

      Sub LoopRefFields()
        Dim fld As word.Field
      
        For Each fld In ActiveDocument.Fields
          If fld.Type = wdFieldRef Then
              fld.code.Style = "Intense Reference"
          End If
        Next
      End Sub
      

      如果文档包含很多字段,您可能想要测试哪种方法最快。就个人而言,我更倾向于(3),因为它更清楚发生了什么,而且代码更少。