在Excel VSTO中插入行事件?

时间:2010-03-10 09:21:24

标签: c# excel vsto

更简单的说法是“how to handle resize of range upon insert column/row in Excel via VSTO?”:

excel VSTO中是否有办法处理“插入行”或“插入列”事件?

2 个答案:

答案 0 :(得分:2)

Excel中没有此类事件。您可以通过Worksheet.ChangeApplication.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工作表方法所以你必须考虑到这一点。