保留字符串变量中的字符格式

时间:2018-02-13 23:10:52

标签: word-vba

我有一个过程,它接受所选文本并将其放入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参数中。所需要的是一种将内容添加为格式化文本或在文本添加到字段后恢复格式的方法。

1 个答案:

答案 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