C#UsedRange计数不正确

我使用UsedRange对象的Excel.Worksheet属性来获取行数和列数。 如果我尝试删除列或行, UsedRange计数应相应减less。 但是,经过大量的debugging,按照一定的顺序改变列的Hidden属性和列宽。 计数不会相应地改变,这应该表明为细胞设定了锚点。 请帮忙解释一下(因为它会影响我的代码)。

testing代码:

 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工作表中的计数与历史(caching)计数。 由于新的行或列可能没有实际的数据,所以我使用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;