gpt4 book ai didi

C# UsedRange 计数不正确

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:01 24 4
gpt4 key购买 nike

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

测试代码:

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 界面的应用程序。例如,用户有一个存货 list 和采购成本 list ,末尾有小计或平均价格行。 (实际的小计行会比sum和average复杂很多)因此,list应该是可扩展的,而小计行不能。因此,我需要跟踪是否添加或删除了新行或新列,因此我需要交叉检查 excel 工作表中的计数与历史(缓存)计数。由于新行或新列可能没有实际数据,我使用 UsedRange 属性来确定显示的当前行/列数。因此,UsedRange 包含已删除的行/列这一事实使我无法进行计算。


虽然我找不到解除 anchor 效应的方法,但我终于想出了一个方法来完成这项工作:

使用单个单元格名称范围来标记工作表的最后一个单元格,使用 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# UsedRange 计数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com