更简单的说法是“how to handle resize of range upon insert column/row in Excel via VSTO?”:
excel VSTO中是否有办法处理“插入行”或“插入列”事件?
答案 0 :(得分:2)
Excel中没有此类事件。您可以通过Worksheet.Change或Application.SheetChange事件插入或删除行时选择。
有关详细讨论,请参阅Dick Kusleika撰写的文章Deleted Rows。
但是如果你想要实现的只是确保在插入行时调整范围对象的大小,那么,正如你所指出的那样there is is nothing that you need to do,因为Range对象会自动扩展。
希望这有帮助!
答案 1 :(得分:0)
范围自动调整大小,因此您通常不必对对象执行任何操作,并且没有RowInserted事件。如果您希望在插入行时收到通知,则必须使用Worksheet.Change
。
我发现检查此事件处理程序中是否已更改行的最快方法是比较Target.Address == Target.EntireRow.Address
。当使用cut / insert插入,删除或移动行时,这些将返回true。对于列,您可以对Target.EntireColumn
执行相同的操作。请注意,如果插入失败,这也将返回true(例如,如果路径中存在数据透视表并且Excel中止插入)
对我而言,这正是我想要的,可以在失败的行动中运行。
private void ActiveWorksheet_Change(Excel.Range Target)
{
if(Target.Address == Target.EntireRow.Address)
{
//do stuff on insert/delete/cut+insert
}
}
如果您只需要插入,删除或剪切/插入行,或者如果您在操作失败时需要执行其他操作,则可以执行我先尝试的操作:
将Worksheet.UsedRange.Rows.Count
存储在以Dictionary<string, int>
为关键字的Worksheet.Name
中。然后,将新Worksheet.UsedRange.Rows.Count
与保存的计数进行比较,并相应地采取行动。请注意,在工作表重命名后,或者如果新工作表获得旧工作表的名称,这将会以有趣的方式中断,除非您找到一种方法来捕获这些类型的事件并更新/删除字典条目,但我还没有找到更好的ID工作表方法所以你必须考虑到这一点。