繁体   English   中英

C#UsedRange计数错误

[英]C# UsedRange count incorrect

我用UsedRange的财产Excel.Worksheet对象,以获取行和列数。 如果我尝试删除列或行, UsedRange计数应相应减少。 但是,经过大量调试后,按某些顺序更改了列的Hidden属性和列宽。 计数不会相应更改,这应表明已为该单元格设置了锚点。 请帮助解释(因为它会影响我的代码很多)。

测试代码:

Worksheet worksheet = Globals.ThisAddIn.Application.ActiveSheet;
Debug.WriteLine("Used Range Column Count 1: " + worksheet.UsedRange.Columns.Count);

worksheet.Range["A1"].Formula = "1";
worksheet.Range["B1"].Formula = "1";
worksheet.Range["C1"].Formula = "1";
worksheet.Range["D1"].Formula = "1";
Debug.WriteLine("Used Range Column Count 2: " + worksheet.UsedRange.Columns.Count);

Range column = worksheet.Columns[4];
column.Delete();
Debug.WriteLine("Used Range Column Count 3: " + worksheet.UsedRange.Columns.Count);

worksheet.Range["D1"].Formula = "1";
column = worksheet.Columns[4];
column.ColumnWidth = 20.0;
column.Hidden = true;
column.Hidden = false;
column.Delete();
Debug.WriteLine("Used Range Column Count 4: " + worksheet.UsedRange.Columns.Count);

worksheet.Range["D1"].Formula = "1";
column = worksheet.Columns[4];
column.Hidden = true;
column.Hidden = false;
column.ColumnWidth = 20.0;
column.Delete();
Debug.WriteLine("Used Range Column Count 5: " + worksheet.UsedRange.Columns.Count);

结果:

已用范围列数1:1:(预期)
使用的范围列数2:4(预期)
使用的范围列数3:3(预期)
使用的范围列数4:4(不期望)
使用的范围列数5:3(预期)


有关正确使用范围计数的必要性的进一步说明:

我正在开发可以增强excel界面的应用程序。 例如,用户拥有一个清单和采购成本列表,最后是一个小计或平均价格线。 (实际的子总行比总和和平均要复杂得多)因此,列表应该可扩展,但子总行不能。 结果,我需要跟踪是否添加或删除了新行或新列,因此我需要对照历史(缓存)计数来交叉检查excel工作表中的计数。 由于新的行或列上可能没有实际数据,因此我使用UsedRange属性确定显示的当前行/列数。 因此,UsedRange包含已删除的行/列的事实使我无法进行计算。


尽管我找不到提高锚定效果的方法,但我终于想出了一种方法来完成这项工作:

使用单个单元格名称范围来标记工作表的最后一个单元格,并使用UsedRange属性来初始化范围。

如果您需要避免向用户显示该范围,则可以尝试将数据保存在工作表的自定义属性中。 但是,此方法在用户操作跟踪方面需要更多注意事项(如果添加行/列,则命名范围参考将自动更改)

好吧, UsedRange不能很好地确定最后一行和最后一列。 相反,您可以使用以下代码:

// get last row
var WorksheetLastRow = worksheet.Cells.Find(
    What: "*",
    SearchOrder: Excel.XlSearchOrder.xlByRows,
    SearchDirection: Excel.XlSearchDirection.xlPrevious,
    MatchCase: false
).Row;

// get last column
var WorksheetLastCol = worksheet.Cells.Find(
    What: "*",
    SearchOrder: Excel.XlSearchOrder.xlByColumns,
    SearchDirection: Excel.XlSearchDirection.xlPrevious,
    MatchCase: false
).Column;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM