为什么TextRange.InsertSymbol方法替换了我的TextRange中的文本?

Sir*_*elf 5 vba powerpoint-vba powerpoint-2010

在Powerpoint中通过VBA生成幻灯片的过程中,我需要在生成的文本中插入“ Wingdings符号”,该文本是两个值的比较。我做了这种方法,它完全可以按我的意愿工作

Sub formatDifference(header As String, old As Integer, now As Integer, txt As TextRange)
    Dim diff As Integer
    diff = old - now

    With txt
        If (diff > 0) Then
            .InsertSymbol "Wingdings", getArrowCharCode("down")
                                       ' getArrowCharCode is a custom function to get the 
                                       ' char code as an Integer
        ElseIf (diff = 0) Then
            .InsertSymbol "Wingdings", getArrowCharCode("right")
        Else
            .InsertSymbol "Wingdings", getArrowCharCode("up")
        End If

        .InsertBefore header & now & " ("    ' <-- note this line
        .InsertAfter " " & Abs(diff) & ")"
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

formatDifference子基本上只是添加在文本子弹点线(在下面的例子中,在我添加非子弹文本的过程被称为4次)。

我不明白的是,当我用一些文本启动文本然后使用该InsertSymbol方法时,文本似乎实际上已被替换,而不是在末尾附加符号。这是不同代码的示例:

Sub formatDifference(header As String, old As Integer, now As Integer, txt As TextRange)
    Dim diff As Integer
    diff = old - now

    With txt
        .InsertAfter header & now & " (" ' <-- line moved here
                                         '     it doesn't matter if I use 
                                         '     .Text = "initial text"', 
                                         '     it will do the same thing
        If (diff > 0) Then
            .InsertSymbol "Wingdings", getArrowCharCode("down")
        ElseIf (diff = 0) Then
            .InsertSymbol "Wingdings", getArrowCharCode("right")
        Else
            .InsertSymbol "Wingdings", getArrowCharCode("up")
        End If
        .InsertAfter " " & Abs(diff) & ")"
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

这是我从上面的代码(以相同的顺序)得到的两个结果的比较:

代码差异的示例

我对InsertSymbol方法的理解是,它将在最后一段的末尾插入符号,但看起来不像...我的第二个示例是否有错误或是否误解了该方法描述


PS注意:标头参数包含回车符和换行符,这就是为什么第二次捕获在同一行上具有所有点的原因,因为似乎替换了第一部分。

Asg*_*ger 1

InsertSymbol 实现的文档

Microsoft Word 的Range.InsertSymbolSelection.InsertSymbol实现描述如下:

插入符号代替指定范围。
如果您不想替换范围,请在使用此方法之前使用 Collapse 方法。

Microsoft Publisher 的TextRange.InsertSymbol实现描述为:

返回一个 TextRange 对象,该对象表示插入到指定范围或选择的位置的符号。
如果您不想替换范围或选择,请在使用此方法之前使用 Collapse 方法。

然后是 Office TextRange2.InsertSymbol和 PowerPoint TextRange2.InsertSymbol方法,描述如下:

将指定字体集中的符号插入到 TextRange2 对象表示的文本范围中。

考虑到这一点,TextRange.InsertSymbol实现的 PowerPoint 文档有点不准确,包括对所包含代码示例的错误解释(“在第一句话之后”)。

在TextRange之后插入符号

如果您想在提供的后面插入符号TextRange,我建议使用以下包装函数:

Public Function InsertSymbolAfter(newTextRange As PowerPoint.TextRange, _
                           newFontName As String, _
                           newCharNumber As Long, _
                           Optional newUnicode As MsoTriState = msoFalse) As TextRange

    If Right(newTextRange.Text, 1) = vbCr Then
        Set InsertSymbolAfter = newTextRange.Characters(newTextRange.Characters.Count) _
            .InsertSymbol(newFontName, newCharNumber, newUnicode)
        newTextRange.InsertAfter vbCr
    Else
        Set newTextRange = newTextRange.InsertAfter("#")
        Set InsertSymbolAfter = newTextRange _
            .InsertSymbol(newFontName, newCharNumber, newUnicode)
    End If

End Function
Run Code Online (Sandbox Code Playgroud)

它区分两种情况:

  • 如果最后一个字符是vbCRChr(13)、回车符、CR),则在 CR 之前添加该符号(CR 会被新符号替换,然后再次添加)。
  • 在所有其他情况下,首先添加任意字符,然后用新符号替换。

测试

可以通过以下方式测试整个文本框、段落或字符的函数:

Private Sub testit()
    Const WingDingsLeft As Long = 231
    Const WingDingsRight As Long = 232
    Const WingDingsUp As Long = 233
    Const WingDingsDown As Long = 234
        
    With ActivePresentation.Slides(1).Shapes(1).TextFrame
        InsertSymbolAfter(.TextRange, "Wingdings", WingDingsUp)
        InsertSymbolAfter(.TextRange.Paragraphs(1), "Wingdings", WingDingsDown)
        InsertSymbolAfter(.TextRange.Characters(2, 1), "Wingdings", WingDingsRight)
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)