Powerpoint 中形状的部分下划线检查不起作用?

Partial Underline check for a shape in Powerpoint not working?

ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoTrue
ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoFalse
ppShape.TextFrame.TextRange.Font.Underline == MsoTriState.msoTriStateMixed

以上代码检查 powerpoint 形状是否有... 1.所有文字都加下划线 2.所有文字不加下划线 3. 部分文字有下划线

第 3 点,部分文本加下划线不起作用,returns 随机混合下划线形状的 false 或 true。

这对粗体和斜体非常有效,即

ppShape.TextFrame.TextRange.Font.Bold == MsoTriState.msoTriStateMixed
ppShape.TextFrame.TextRange.Font.Italic == MsoTriState.msoTriStateMixed

我还在 GitHub 中就此问题向 Microsoft 提出了问题, https://github.com/MicrosoftDocs/VBA-Docs/issues/462

让我知道是否有任何方法可以解决这个问题,或者至少有任何替代方法可以解决这个问题???

作为解决方法,您可以检查 TextRange 中的每个 运行。在 VBA 中,您可以将形状传递给这样的函数:

Function IsUnderlined(oSh As Shape) As Boolean
    Dim oRng As TextRange
    For Each oRng In oSh.TextFrame.TextRange.Runs
        If oRng.Font.Underline Then
            IsUnderlined = True
            Exit Function
        End If
    Next
End Function

如果文本中的任何字符带有下划线,该函数将 return 为真。

感谢您阐明 TextRange.Runs 方法,这确实是一个很棒的函数,它还节省了大量性能而不是循环字符。

我在 C#.Net 中创建了一个类似的函数,以便像默认函数一样轻松使用它。

using pp = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;

public static MsoTriState IsUnderlined(pp.Shape parShape)
{
    int cntUnderline = 0;

    foreach (pp.TextRange textTR in parShape.TextFrame.TextRange.Runs())
    {
        if (textTR.Font.Underline == MsoTriState.msoTrue)
        {
            cntUnderline++;
        }
    }

    if (cntUnderline == 0)
    {
        //No Underline
        return MsoTriState.msoFalse;
    }
    else if (parShape.TextFrame.TextRange.Runs().Count == cntUnderline)
    {
        //All Underline
        return MsoTriState.msoTrue;
    }
    else if (parShape.TextFrame.TextRange.Runs().Count != cntUnderline)
    {
        //Mixed Underline
        return MsoTriState.msoTriStateMixed;
    }

    return MsoTriState.msoTriStateToggle; //Consider as error
}