触发VBA Excel中插入和删除行的事件



我使用下面的代码来触发某些事件时,行已删除和插入,这段代码的好处是,它使插入和删除的行之间的区别,从而触发事件的每种情况,这唯一的限制是它不工作,如果你做的第一个更改工作簿是添加或删除一行,但它工作得很好后,第一次更改。有人知道怎么解决这个问题吗?有人建议在代码之前使用Worksheet_Activate事件,但我太没有经验了,无法弄清楚……

首先我们定义一个范围名称(RowMarker =$ a $1000)

Private Sub Worksheet_Change(ByVal Target As Range)
Static lngRow As Long
Dim rng1 As Range
Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
If lngRow = 0 Then
lngRow = rng1.Row
Exit Sub
End If
If rng1.Row = lngRow Then Exit Sub
If rng1.Row < lngRow Then
MsgBox lngRow - rng1.Row & " rows removed"
Else
MsgBox rng1.Row - lngRow & " rows added"
End If
lngRow = rng1.Row
End Sub
  1. 请复制表格代码模块中要处理的下一个代码(覆盖现有代码事件):
Option Explicit
Private Sub Worksheet_Activate()
Dim rng1 As Range
Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
ThisWorkbook.lRow = rng1.row
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Static lngRow As Long
Dim rng1 As Range
Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
If lngRow = 0 Then lngRow = ThisWorkbook.lRow
If lngRow = 0 Then 'only for the case you copied the code and forgot sheet activating...
lngRow = rng1.row
Exit Sub
End If
If rng1.row = lngRow Then Exit Sub
If rng1.row < lngRow Then
MsgBox lngRow - rng1.row & " rows removed"
Else
MsgBox rng1.row - lngRow & " rows added"
End If
lngRow = rng1.row
End Sub

1.1复制ThisWorkbook代码模块中的代码:

Public lRow As Long
Private Sub Workbook_Open()
Dim rng1 As Range
Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange
lRow = rng1.row
End Sub
  1. 停用活动表(转到另一个)并激活它(返回)。只有第一次!当您打开工作簿并转到该特定工作表时,该事件将自动触发。

  2. 尝试解决方案并发送一些反馈

lRow也可以在没有静态变量的情况下使用,但我试图保持您的初始代码原样,仅在Change事件触发时将其修改为首次引用。

添加工作簿事件

Private Sub Workbook_Open()
Sheet1.lrow = Sheet1.Range("RowMarker").Row
End Sub

工作表事件
Public lrow As Long
Private Sub Worksheet_Change(ByVal Target As Range)

Dim n as Long
n = Me.Range("RowMarker").Row - lrow
lrow = Me.Range("RowMarker").Row
If n > 0 Then
MsgBox n & " rows inserted"
ElseIf n < 0 Then
MsgBox n & " rows removed"
End If
End Sub

最新更新