Error: The specified value is out of range in C# power point
Error: The specified value is out of range in C# power point
我正在尝试校准整个演示文稿中的文本,但如果我有一些已经设计好的 ppt,我的第一张幻灯片将包含近 37 个形状。
所以当我校准一些形状时,它给出了一个错误,说“指定的值超出范围”
下面是我的代码:
private void Calibrify_text_Click(object sender, RibbonControlEventArgs e)
{
try
{
PowerPoint.Application ppApp = Globals.ThisAddIn.Application;
PowerPoint.SlideRange ppslr = ppApp.ActiveWindow.Selection.SlideRange;
int slidecount = ppApp.ActiveWindow.Presentation.Slides.Count;
for(int i = 1; i <= slidecount; i++)
{
ppApp.ActiveWindow.Presentation.Slides.Range(i).Select();
ppApp.ActivePresentation.Slides.Range(i).Shapes.SelectAll();
PowerPoint.ShapeRange ppshr = ppApp.ActiveWindow.Selection.ShapeRange;
for(int j = 1; j <= ppshr.Count; j++)
{
if (ppshr[j].HasTextFrame.ToString() !="")
{
var text = ppshr[i].ToString();
if (ppshr[j].TextFrame.TextRange.Text != "")
{
var text1 = ppshr[j].TextFrame.TextRange;
text1.Font.Name = "Calibri Light";
}
}
}
}
}
catch (COMException Ex)
{
Debug.WriteLine("Some problem" + Ex.Message + Ex.StackTrace);
MessageBox.Show(Ex.Message);
}
}
在 C# 中,索引是从 0 开始的(例如 VB/VBA,索引是从 1 开始的)。这使得这条线失败:
for(int i = 1; i <= slidecount; i++)
应该是:
for(int i = 0; i < slidecount; i++)
(你以后犯同样的错误)
我为你做了一个例子假设有几个文件有几个形状在上面。此外,我 做了一些分组 (!!) - 我认为是您的代码中的问题。
所以我的演示文稿包含 四张幻灯片,每张幻灯片包含
- 一个文本框
- 一个包含两个文本框和
的组
- 一组,每组另外两个文本框。
(见下面我的演示文件的截图)
演示文件
在我的代码中,我检查当前形状是否是分组元素。在这种情况下,我称我的方法为 recursivley。否则我检查 是否有 textFrame 并设置相应的字体 .
插件代码
private void btnCalibrifyText_Click(object sender, RibbonControlEventArgs e)
{
try
{
PowerPoint.Application ppApp = Globals.ThisAddIn.Application;
PowerPoint.SlideRange ppslr = ppApp.ActiveWindow.Selection.SlideRange;
int slidecount = ppApp.ActiveWindow.Presentation.Slides.Count;
for (int i = 1; i <= slidecount; i++)
{
ppApp.ActiveWindow.Presentation.Slides.Range(i).Select();
ppApp.ActivePresentation.Slides.Range(i).Shapes.SelectAll();
PowerPoint.ShapeRange ppshr = ppApp.ActiveWindow.Selection.ShapeRange;
// new version
foreach (PowerPoint.Shape shape in ppshr)
{
changeFont(shape);
}
}
MessageBox.Show("Done!");
}
catch (COMException comEx)
{
Debug.WriteLine("COMException: " + comEx.Message + comEx.StackTrace);
MessageBox.Show(comEx.Message);
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message + ex.StackTrace);
MessageBox.Show(ex.Message);
}
}
private void changeFont(PowerPoint.Shape shape)
{
if (shape.Type == Microsoft.Office.Core.MsoShapeType.msoGroup)
{
foreach (PowerPoint.Shape childShape in shape.GroupItems)
{
changeFont(childShape);
}
}
else if (shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
{
if (shape.TextFrame.TextRange.Text != "")
{
var text1 = shape.TextFrame.TextRange;
text1.Font.Name = "Calibri Light";
}
}
}
对我有用。希望它也能帮到你。
我正在尝试校准整个演示文稿中的文本,但如果我有一些已经设计好的 ppt,我的第一张幻灯片将包含近 37 个形状。
所以当我校准一些形状时,它给出了一个错误,说“指定的值超出范围”
下面是我的代码:
private void Calibrify_text_Click(object sender, RibbonControlEventArgs e)
{
try
{
PowerPoint.Application ppApp = Globals.ThisAddIn.Application;
PowerPoint.SlideRange ppslr = ppApp.ActiveWindow.Selection.SlideRange;
int slidecount = ppApp.ActiveWindow.Presentation.Slides.Count;
for(int i = 1; i <= slidecount; i++)
{
ppApp.ActiveWindow.Presentation.Slides.Range(i).Select();
ppApp.ActivePresentation.Slides.Range(i).Shapes.SelectAll();
PowerPoint.ShapeRange ppshr = ppApp.ActiveWindow.Selection.ShapeRange;
for(int j = 1; j <= ppshr.Count; j++)
{
if (ppshr[j].HasTextFrame.ToString() !="")
{
var text = ppshr[i].ToString();
if (ppshr[j].TextFrame.TextRange.Text != "")
{
var text1 = ppshr[j].TextFrame.TextRange;
text1.Font.Name = "Calibri Light";
}
}
}
}
}
catch (COMException Ex)
{
Debug.WriteLine("Some problem" + Ex.Message + Ex.StackTrace);
MessageBox.Show(Ex.Message);
}
}
在 C# 中,索引是从 0 开始的(例如 VB/VBA,索引是从 1 开始的)。这使得这条线失败:
for(int i = 1; i <= slidecount; i++)
应该是:
for(int i = 0; i < slidecount; i++)
(你以后犯同样的错误)
我为你做了一个例子假设有几个文件有几个形状在上面。此外,我 做了一些分组 (!!) - 我认为是您的代码中的问题。
所以我的演示文稿包含 四张幻灯片,每张幻灯片包含
- 一个文本框
- 一个包含两个文本框和 的组
- 一组,每组另外两个文本框。
(见下面我的演示文件的截图)
演示文件
在我的代码中,我检查当前形状是否是分组元素。在这种情况下,我称我的方法为 recursivley。否则我检查 是否有 textFrame 并设置相应的字体 .
插件代码
private void btnCalibrifyText_Click(object sender, RibbonControlEventArgs e)
{
try
{
PowerPoint.Application ppApp = Globals.ThisAddIn.Application;
PowerPoint.SlideRange ppslr = ppApp.ActiveWindow.Selection.SlideRange;
int slidecount = ppApp.ActiveWindow.Presentation.Slides.Count;
for (int i = 1; i <= slidecount; i++)
{
ppApp.ActiveWindow.Presentation.Slides.Range(i).Select();
ppApp.ActivePresentation.Slides.Range(i).Shapes.SelectAll();
PowerPoint.ShapeRange ppshr = ppApp.ActiveWindow.Selection.ShapeRange;
// new version
foreach (PowerPoint.Shape shape in ppshr)
{
changeFont(shape);
}
}
MessageBox.Show("Done!");
}
catch (COMException comEx)
{
Debug.WriteLine("COMException: " + comEx.Message + comEx.StackTrace);
MessageBox.Show(comEx.Message);
}
catch (Exception ex)
{
Debug.WriteLine("Exception: " + ex.Message + ex.StackTrace);
MessageBox.Show(ex.Message);
}
}
private void changeFont(PowerPoint.Shape shape)
{
if (shape.Type == Microsoft.Office.Core.MsoShapeType.msoGroup)
{
foreach (PowerPoint.Shape childShape in shape.GroupItems)
{
changeFont(childShape);
}
}
else if (shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
{
if (shape.TextFrame.TextRange.Text != "")
{
var text1 = shape.TextFrame.TextRange;
text1.Font.Name = "Calibri Light";
}
}
}
对我有用。希望它也能帮到你。