Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel C#互操作-仅将选定范围缩小到填充的单元格_C#_Excel_Interop_Vsto - Fatal编程技术网

Excel C#互操作-仅将选定范围缩小到填充的单元格

Excel C#互操作-仅将选定范围缩小到填充的单元格,c#,excel,interop,vsto,C#,Excel,Interop,Vsto,我有一个VSTO解决方案,可以更正高亮显示单元格中的数据。我遇到的问题是,如果用户选择了整行/整列,那么程序在处理最后一个填充的单元格之后很长一段时间内会在数千个空单元格中循环 我的代码如下所示: var addIn = Globals.ThisAddIn; Excel.Worksheet sheet = addIn.Application.ActiveSheet; Excel.Range range = addIn.Application.Sel

我有一个VSTO解决方案,可以更正高亮显示单元格中的数据。我遇到的问题是,如果用户选择了整行/整列,那么程序在处理最后一个填充的单元格之后很长一段时间内会在数千个空单元格中循环

我的代码如下所示:

        var addIn = Globals.ThisAddIn;
        Excel.Worksheet sheet = addIn.Application.ActiveSheet;
        Excel.Range range = addIn.Application.Selection;

        foreach (Excel.Range cell in range.Cells)
        {
            var val = cell.Value2;
            if (val == null)
                continue;
if (cell.Row > populatedRange.Row ||
    cell.Column > populatedRange.Column)
    break;
我看过关于如何使用的帖子:

AdvancedFilter(Excel.XlFilterAction.xlFilterInPlace, Type.Missing)
但我似乎无法将两者联系起来。我要么希望我的“range”对象仅限于填充的单元格,要么在超过最后一个值时能够使foreach循环短路

我想做这样的事情:

        var addIn = Globals.ThisAddIn;
        Excel.Worksheet sheet = addIn.Application.ActiveSheet;
        Excel.Range range = addIn.Application.Selection;

        foreach (Excel.Range cell in range.Cells)
        {
            var val = cell.Value2;
            if (val == null)
                continue;
if (cell.Row > populatedRange.Row ||
    cell.Column > populatedRange.Column)
    break;
但如果选择了整行/整列以外的内容(用户选择填充范围之外的单元格,并且忽略所有后续填充的单元格),则这可能会破坏代码


我知道我遗漏了一些简单的东西,但我的尝试(和搜索)并没有得到答案。

为什么不将range.Cells转换为数组并在内存中处理呢。 它比遍历每个单元格更快,然后您可以使用Linq的所有内存功能或其他功能来过滤和更正数据。。。然后您只需将更新的范围发送回excel

做:

var obj = range.Cell
将您的范围投射到2维的
对象[,]
。 我想

这也行


注意。

您可以使用工作表上的Range.SpecialCells方法查找最后一个单元格。然后,可以修改循环以在移动到最后一行或最后一列之外时退出。下面的代码段将为您提供最后一个单元格的行号和列号。您仍然可以处理一些空单元格,但不会一直处理到第1048574行

Excel.Range last = Globals.Sheet1.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
int lastRowNumber = last.Row;
int lastColumnNumber = last.Column;

我不知道为什么我花了一年的时间才最终认识到这一点,但这就是我最终所做的。。。这是一个迟来的感谢。值得一提的是,我花了这么长时间去做我妻子也希望我做的事情。