我有一个过程,它接受所选文本并将其放入XE字段以供索引使用;但是,如果选择包含上标或下标字符,当我将变量放在字段中并且索引创建不正确时,它们会被删除。
下面代码中引用的表单只允许用户键入一个字符串,然后通过另一个过程将其添加到索引中。
Sub createAbbreviation()
Dim strFieldTextAbbr As String
Dim rngAbbreviation As Range
If Selection.Type = wdSelectionIP Then
Load frmInsertAbbreviation
Else
Set rngAbbreviation = Selection.FormattedText
strAbbreviation = Selection.Text
Load frmInsertAbbreviation
End If
frmInsertAbbreviation.Show
If frmInsertAbbreviation.Tag = "Cancel" Then
Unload frmInsertAbbreviation
strAbbreviation = ""
Exit Sub
End If
strFieldTextAbbr = """" & rngAbbreviation & """ \f Abbreviation \t """ & frmInsertAbbreviation.strDefinition & """"
If Selection.Type = wdSelectionIP Then
If Selection.Font.Subscript = True Then
Selection.Font.Subscript = False
End If
ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldIndexEntry, _
Text:=strFieldTextAbbr
Else
Selection.MoveRight Unit:=wdCharacter, Count:=1
If Selection.Font.Subscript = True Then
Selection.Font.Subscript = False
End If
ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldIndexEntry, _
Text:=strFieldTextAbbr
End If
Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
Selection.Find.ClearFormatting
With Selection.Find
.Text = """"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
If Selection.Find.Execute = True Then
Selection.Collapse wdCollapseRight
Do Until InStr(1, Selection, Chr(34)) <> 0
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Loop
End If
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Range.FormattedText = rngAbbreviation
Unload frmInsertAbbreviation
strAbbreviation = ""
End Sub
编辑:
我看到它失败的原因是因为我将范围放入字符串中,有效地否定了它的对象状态。我将继续努力,看看我是否能让它发挥作用。我觉得我走在正确的轨道上,只需要一段时间才能到达那里。任何帮助将不胜感激。
事实证明,问题是格式化文本不能放在Fields.Add方法的Text参数中。所需要的是一种将内容添加为格式化文本或在文本添加到字段后恢复格式的方法。
答案 0 :(得分:1)
在Word中将格式从一个地方传递到另一个地方的方法是使用Range对象的FormattedText
属性。
您需要分多步构建XE字段:插入字段,引入格式化文本,将剩余文本附加为字符串。
示例代码使用简单的InputBox从用户获取文本;当然,你可以使用UserForm。
该示例使用两个Range对象,一个用于选择(可能包含要保留的格式);另一个是XE字段及其代码。请注意,Field.Code
还返回一个Range对象,此对象用于构建索引条目。
Sub InsertIndexFieldWithFormatting()
Dim doc As word.Document
Dim rngXEcontent As word.Range
Dim rngXEfield As word.Range
Dim XEfield As word.Field
Dim sMoreXEcontent As String
Set rngXEcontent = Selection.Range
Set doc = rngXEcontent.Parent
sMoreXEcontent = InputBox("Content for the index:")
Set rngXEfield = rngXEcontent.Duplicate
'Position for the XE field
rngXEfield.Collapse wdCollapseStart
rngXEfield.MoveEnd wdCharacter, -1
Set XEfield = doc.Fields.Add(rngXEfield, _
wdFieldIndexEntry, Chr(34), False)
Set rngXEfield = XEfield.code
rngXEfield.Collapse wdCollapseEnd
rngXEfield.FormattedText = rngXEcontent.FormattedText
rngXEfield.Collapse wdCollapseEnd
rngXEfield.InsertAfter " " & sMoreXEcontent & Chr(34) & " "
'Otherwise the additional text is sub-/superscripted
rngXEfield.Font.Reset
End Sub