C# Excel VSTO范围删除循环会随机停止工作

C# Excel VSTO范围删除循环会随机停止工作,c#,vsto,C#,Vsto,我有一个大型VSTO应用程序,它接受一个命名范围,并在其中添加行。然后,工作表会有一个按钮,该按钮将删除指定范围内的所有行(但仍保持该范围不变)。但是,当我运行该循环时,它将随机停止工作。没有错误消息,没有警告,只是停止运行。有些行被删除,但不是全部,删除的行数似乎是随机的。我的代码非常简单,唯一特别的是我希望前两行永远不要删除。这是我的密码 Excel.Workbook wb = (Excel.Workbook)Globals.ThisWorkbook.InnerObject;

我有一个大型VSTO应用程序,它接受一个命名范围,并在其中添加行。然后,工作表会有一个按钮,该按钮将删除指定范围内的所有行(但仍保持该范围不变)。但是,当我运行该循环时,它将随机停止工作。没有错误消息,没有警告,只是停止运行。有些行被删除,但不是全部,删除的行数似乎是随机的。我的代码非常简单,唯一特别的是我希望前两行永远不要删除。这是我的密码

Excel.Workbook wb = (Excel.Workbook)Globals.ThisWorkbook.InnerObject;
            Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets["MySheet"];
            Excel.Range rng = ws.get_Range("MyRange");

            int totalRun = 0;

            foreach (Excel.Range row in rng.Areas[1].Rows)
                {
                if(totalRun>1)
                    row.EntireRow.Delete(Excel.XlDirection.xlUp);

                totalRun++;
                }
正如你所看到的,我认为问题与区域或其他东西有关,它们只给了我一个部分集,但事实似乎并非如此。我要删除的行是文本和数字的混合。同样,有些行删除了,但有些行不删除,这看起来是随机的。范围扩大到大约500行,此循环将删除多达10%的行和多达75%的行

此外,由于代理错误消息,我已经更改了应用程序的一个属性。我原以为这也会有帮助,但事实并非如此——看起来是这样的

[assembly: ExcelLocale1033(false)]

救命啊

我仍然不知道上面的代码为什么不起作用,但我使用了这个答案中的代码,并且它起作用了。奇怪


您在foreach内部修改的集合上使用了foreach枚举器。在纯.net中,这会引发错误。这个com集合似乎不是这样,但潜在的问题仍然是
MyRange
连续(即
$A$1:$F$9999
,还是多个子范围的联合(即
'Sheet1'!$A$10:$S$10,'Sheet1'!$A$9:$S$9,'Sheet1'!$A$8:$S$8
)?如果它不是连续的,我会怀疑它也与使用区域有关。如果它是连续的,您可以使用类似
If(rng.Rows.Count>2){rng.Offset(2).Resize(rng.Rows.Count-2).EntireRow.Delete(Excel.XlDirection.xlUp);}
(语法可能有点不正确;从VBA临时翻译)
for (int i = selectedRange.Rows.Count; i > 0; i--)
{
  firstSelectedItem = ((ExcelIntOp.Range)selectedRange.Cells[i, 1]);

  if (firstSelectedItem.Value2 != null)
  {
      firstSelectedItem.EntireRow.Delete(System.Type.Missing);
      firstSelectedItem = ((ExcelIntOp.Range)selectedRange.Cells[i, 1]);
  }
}