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
}
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
}