在 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
- 请复制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
停用活动的sheet(转到另一个)并激活它(回来)。只是第一次!当您打开工作簿并转到特定 sheet 时,事件会自动触发。
尝试解决方案并发送一些反馈
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
我正在使用下面的代码在删除和插入行时触发某些事件,这段代码的好处是它区分了插入行和删除行,从而针对每种情况触发事件,唯一这样做的限制是,如果您对工作簿所做的第一次更改是添加或删除一行,则它不起作用,但在第一次更改后它可以正常工作。 任何人都知道如何解决这个问题?有人在代码之前建议了一个 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
- 请复制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
停用活动的sheet(转到另一个)并激活它(回来)。只是第一次!当您打开工作簿并转到特定 sheet 时,事件会自动触发。
尝试解决方案并发送一些反馈
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