我使用了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;
关于c# - C#UsedRange计数错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41654155/