簡體   English   中英

Excel C#Interop-將選定范圍縮小到僅填充的單元格

[英]Excel C# Interop - narrow selected range to populated cells only

我有一個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;

我看過有關如何使用的線程:

AdvancedFilter(Excel.XlFilterAction.xlFilterInPlace, Type.Missing)

但是我似乎無法將兩者捆綁在一起。 我要么希望我的“范圍”對象僅限於填充的單元格,要么希望當我超過最后一個值時能夠使我的foreach循環短路。

我想到做這樣的事情:

if (cell.Row > populatedRange.Row ||
    cell.Column > populatedRange.Column)
    break;

但是,如果選擇了除整個行/列以外的內容,則有可能破壞代碼(用戶選擇一個不在填充范圍內的單元格,而所有后續填充的單元格都將被忽略)。

我知道我缺少一些簡單的東西,但是我的嘗試(和搜索)沒有給出答案。

您可以在工作表上使用Range.SpecialCells方法查找最后一個單元格。 然后,您可以修改循環以在移至最后一行或最后一列時退出。 以下代碼段將為您提供最后一個單元格的行號和列號。 您可能仍會處理一些空單元格,但不會一直到1048574行。

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

為什么不將范圍range.Cells轉換為數組並在內存中處理呢? 它的方式比遍歷每個單元的速度快,然后您可以使用Linq的所有內存功能或其他任何功能來過濾和更正數據...然后您只需發送回excel至更新范圍即可。

這樣做:

var obj = range.Cell

會將您的范圍轉換為2維的object[,] 我認為

System.Array myArray = (System.Array)(range.Cells)

也會工作。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM