2010-03-10 103 views

回答

2

则在Excel中没有这样的事件。当行被插入或通过Worksheet.ChangeApplication.SheetChange事件删除您可以拿起。

有关此的详细论述见迪克Kusleika文章Deleted Rows

但是,如果您希望实现的目标是确保您的范围对象在插入行时调整大小,那么如您所述,there is is nothing that you need to do,因为Range对象会自动扩展。

希望这有助于!

+0

如何在范围的末尾添加一列,再次在Worksheet.Change上添加?这不会是Range.Resize ... – HeinrichStack 2013-05-06 14:39:14

0

范围自动调整大小,所以你通常不应做任何事情到你的对象,并没有一个RowInserted事件。如果要在插入行时收到通知,则必须改为使用Worksheet.Change

我发现要检查是否行已在此事件处理程序被更改的最快方法是比较Target.Address == Target.EntireRow.Address。当插入,删除或使用剪切/插入操作时,这些将返回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表单方式,那么这将在表单重命名之后以有趣的方式中断,或者新表单获得旧表单的名称所以你必须考虑到这一点。