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

Trigger events with the insertion and deletion of rows in 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. 请复制sheet代码模块中的下一段代码,待处理(覆盖现有代码事件):
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. 停用活动的sheet(转到另一个)并激活它(回来)。只是第一次!当您打开工作簿并转到特定 sheet 时,事件会自动触发。

  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