2016-06-13 231 views
0

我处于一个Worksheet需要使用另一个Worksheet上的行跟踪的情况。所以,如果用户删除了一个列(他们必须被允许执行),我需要删除另一个工作表中的相应行。这工作正常,下面的代码完成任务。如何判断用户是否正在删除或插入行 - Excel VBA

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = Target.EntireRow.Address Then 
     Debug.Print Target.Address 
     Sheet2.Range("A1").Offset(, Target.Row - 1).EntireColumn.Delete 
    End If 
End Sub 

然而,当用户插入一行,而实际上,我需要一个排在这种情况下,添加到Sheet2此相同的代码运行。如何判断用户在进行行操作时是插入还是删除?

+0

[这里](HTTP:// stackoverflow.com/questions/12064439/vba-worksheet-change-detecting-actual-cell-change)是一个链接,讨论如何分辨实际发生的变化。主要观点是改变事件并没有跟踪改变了它的变化,所以接受的答案是保留一张镜像表来比较以反映变化。 – gtwebb

回答

3

既然不能将其添加为回应还,我相信这是already answered here

基本上,你需要定义一个区域名称,然后调用Worksheet_Change该范围的名称。根据范围是否已经移动以及哪个方向,您应该能够确定是否添加或移除了列,然后相应地进行处理。

从上述联交Brettdj的代码(为了行,但容易多变为列):

可以定义一个范围的名称,如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 
+0

太棒了,你发布的链接对我的情况非常有效 – corbfon

相关问题