我有一种情况,我需要知道是否在我的电子表格中的任何行上手动执行删除。如何在vba中记录此事件。
答案 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),它将始终检测到行删除,无论是否有任何行插入等。