如何在excel中记录删除事件

时间:2010-09-07 06:06:02

标签: excel vba

我有一种情况,我需要知道是否在我的电子表格中的任何行上手动执行删除。如何在vba中记录此事件。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

Private Sub Worksheet_Calculate()

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

End Sub

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

如果您只想阻止人们删除行,您可以在隐藏列中使用数组公式。同样,假设您的应用程序使用前1,000行,请选择A1:A1000(或其他一些空列)并键入= 1并使用Control + Enter进行提交。这将在A1:A1000中创建一个数组。当用户尝试删除行时,他们将收到无用的消息“您无法更改数组的一部分。”,但他们将无法删除该行。

答案 2 :(得分:0)

您可以随时执行以下操作:

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),它将始终检测到行删除,无论是否有任何行插入等。