VBA在MSWord中的上标和下标之前和之后插入

时间:2019-02-02 14:28:12

标签: vba ms-word subscript superscript

我正在尝试创建要在Supercript和下标之前和之后插入的VBA。我的代码在下面。

Public Sub MySubscriptSuperscript() 
Dim myRange As Word.Range, myChr 
For Each myRange In ActiveDocument.StoryRanges  
Do     
     For Each myChr In myRange.Characters 
     If myChr.Font.Superscript = True Then
        myChr.Font.Superscript = False
        myChr.InsertBefore "<sup>"
        myChr.InsertAfter "</sup>"
    End If  

    If myChr.Font.Subscript = True Then
        myChr.Font.Subscript = False
        myChr.InsertBefore "<sub>"
        myChr.InsertAfter "</sub>"
    End If
Next
Set myRange = myRange.NextStoryRange
Loop Until myRange Is Nothing   
Next 
End Sub

此代码对于上标和下标的每个字符都有效。

但是,我正在寻找在完整的上标/下标词/字母之前和之后插入标签的VBA。

示例

C 1 2 H 2 2 O 1 1 和x 2 3 + y 3 9 7 + x 6 7

VBA上方提供以下输出

C<sub>1</sub><sub>2</sub>H<sub>2</sub><sub>2</sub>O<sub>1</sub><sub>1</sub><sub> </sub><sub> </sub> and x<sup>2</sup><sup>3</sup> + y<sup>3</sup><sup>9</sup><sup>7</sup> + x<sup>6</sup><sup>7</sup>

但是我正在寻找这个输出

C<sub>12</sub>H<sub>22</sub>O<sub>11</sub> and x<sup>23</sup> + y<sup>397</sup> + x<sup>67</sup>

请指导,如何实现。

2 个答案:

答案 0 :(得分:0)

我会受到诱惑去获得最终结果最简单的办法 - 在最后,简单地做一个替代的</sub><sub></sup><sup>为空字符串""

但是,我这种方式很懒...

编辑-只是一个想法: 用replace做整个事情不是更快吗?您不必检查每个字符。这是Word记录下来的替换内容,需要做一些修饰:

    Selection.Find.Replacement.ClearFormatting
    With Selection.Find.Replacement.Font
        .Superscript = False
        .Subscript = False
    End With
    With Selection.Find
        .Text = "^?"
        .Replacement.Text = "<sup>^&</sup>"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

因此,最后,您将运行search&replace 4次:

  • 替换上标
  • 删除上标的结束标记和开始标记
  • 替换标
  • 删除下标的结束标记和开始标记

答案 1 :(得分:0)

尝试:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Forward = True
    .Text = ""
    .Wrap = wdFindContinue
    .Font.Subscript = True
    .Replacement.Text = "<sub>^&<\sub>"
    .Execute Replace:=wdReplaceAll
    .Font.Superscript = True
    .Replacement.Text = "<sup>^&<\sup>"
    .Execute Replace:=wdReplaceAll
  End With
End With
Application.ScreenUpdating = True
End Sub

尚不清楚为什么要遍历所有故事范围,因为此类内容通常只在文档正文中。也就是说,修改代码以使其适用于所有故事情节很容易。