我有一个支持宏的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:
在代码中添加了注释,解释了错误处理程序的必要性。
答案 0 :(得分:0)
“定位”字段代码有很多可能性。我相信我在测试中复制了你的保护设置......
最近你用过的方法:
ActiveWindow.View.ShowFieldCodes = True'False将其关闭
就我个人而言,我不喜欢在屏幕上,在用户面前更换内容,除非没有其他方法可以完成任务,或者除非它在速度上有明显的差异。这意味着我尽可能使用Range对象而不是Selection。 Range对象具有一个属性,允许您访问字段代码,即使它们未显示:Range.TextRetrievalMode.IncludeFieldCodes
。但是你也应该使用Range而不是Selection的Selection。
为了帮助您入门:
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不会更改对话框。
这些方面的东西:
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),因为它更清楚发生了什么,而且代码更少。