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

对我有用。希望它也能帮到你。