如何在Excel中logging删除事件

我有一个情况,我需要知道,如果手动删除已经在我的电子表格中的任何一行执行。如何logging这个事件vba。

Private Sub Worksheet_Change(ByVal Target As Range) 'UsedRange works fine provided there is always something in Row1 'Declare varY from a Module and set from Workbook_Open or Sheet.Activate, 'or undo first sheet change, but set variable If Target.Columns.Count = 16384 Then Select Case Sheet1.UsedRange.Rows.Count Case Is > Sheet1.Range("" & varY & "").Rows.Count MsgBox "insert row" Sheet2.Rows(Target.Rows.Address).Insert Shift:=xlDown, _ CopyOrigin:=xlFormatFromLeftOrAbove Case Is < Sheet1.Range("" & varY & "").Rows.Count MsgBox "delete row" Sheet2.Rows(Target.Rows.Address).Delete Shift:=xlUp End Select Else: Sheet2.Range(Target.Address).Value = Target.Value End If varY = Sheet1.UsedRange.Address End Sub 

Excel不提供确定行或列是否已被删除的好方法。 一种方法是使用定义的名称和Calculate事件。 例如,如果您关心前1000行,请将单元格A1001命名为“rLastLow”。 然后在工作表的计算事件中使用这个代码

 Private Sub Worksheet_Calculate() If Me.Range("rngLastRow").Row < 1001 Then MsgBox "Row deleted" End If End Sub 

它不会告诉你哪一行被删除,所以如果你需要知道的话,你需要一些不同的东西。

如果您只想阻止人们删除行,则可以在隐藏列中使用数组公式。 同样,假设您的应用程序使用前1000行,请selectA1:A1000(或其他空列)并键入= 1,然后使用Control + Enter提交。 这将在A1:A1000中创build一个数组。 当用户试图删除一行时,他们将得到无用的消息“你不能改变数组的一部分”,但他们将无法删除该行。

你总是可以这样做:

 Public lngPreviousRow As Long Public lngCurrentRow As Long Private Sub Worksheet_Calculate() lngCurrentRow = Me.Range("rngLastRow").Row If lngCurrentRow < lngPreviousRow Then MsgBox "Row deleted" End If lngPreviousRow = lngCurrentRow End Sub 

只要你设置lngPreviousRow到内部(Workbook_Open例如)它总是会检测行删除,不pipe任何行插入等。