Excel 查找通过粘贴或拖动更改的所有单元格

Excel 查找通过粘贴或拖动更改的所有单元格,excel,vba,worksheet-function,worksheet,Excel,Vba,Worksheet Function,Worksheet,设置: 从具有3列的图纸开始。“ID”、“MyNote”、“MyDate”标题。此工作表可能有数千行数据 我需要“标记”用户对行中任何内容进行更改的任何行。在其他代码中,标记行将依次用于更新我的SQL server上的表 通常,用户在会话中只会更改/更新几行。所以我不想处理工作表中的每一行,特别是那些没有变化的行 我现在的工作: 我已经成功地做到了这一点,每当用户进行更改时,我都会在另一个“flag”列中写入一个“x”。然后,我可以处理任何标记为“x”的行。我这样做是因为: Private Su

设置:

从具有3列的图纸开始。“ID”、“MyNote”、“MyDate”标题。此工作表可能有数千行数据

我需要“标记”用户对行中任何内容进行更改的任何行。在其他代码中,标记行将依次用于更新我的SQL server上的表

通常,用户在会话中只会更改/更新几行。所以我不想处理工作表中的每一行,特别是那些没有变化的行

我现在的工作:

我已经成功地做到了这一点,每当用户进行更改时,我都会在另一个“flag”列中写入一个“x”。然后,我可以处理任何标记为“x”的行。我这样做是因为:

Private Sub Worksheet_Change(ByVal Target As Range)
...
' Flag any lines with a change
    If Not Intersect(Target, Me.Range(TestForChangeColRange)) Is Nothing Then
        Application.EnableEvents = False
          ' Set the "Pending Write" Flag
          Target.Worksheet.Range(PendingWriteCol & Target.Row).Value = "x"
        Application.EnableEvents = True

...  
问题:

这对于一次更新一个单元格非常有效。当用户a)使用拖放复制(拖动单元格右下角以复制拖动的单元格)或b)使用其他工作簿中的粘贴时,就会出现问题,无论哪种情况,一次都会更改多个单元格

在这些情况下,工作表_更改只会看到第一个单元格,而不会看到通过拖动或粘贴编辑的任何额外单元格

我试图找到其他类似的拦截复制/粘贴等的解决方案,但无论如何我都看不到,如果复制了,哪些单元格会受到影响

需要:

我只需要知道哪些行号受到拖动或复制/粘贴的影响。如果我能准确地将这些行标记为已更新,那么我就在做生意

后续行动

使用Tim的解决方案。无法将某些东西重新融入其中。 此外,我需要能够检查特定列是否已编辑,如果已编辑,请清除其他列。例如,如果第2列已编辑,请清除第3列的内容

我试着在For循环中添加测试,但是我的rw.Col的colno出现了

If Not rng Is Nothing Then
    'expand the range so we can flag by row, and not cell-by-cell
    Set rng = Application.Intersect(rng.EntireRow, rngTbl)
    For Each rw In rng.Rows 'loop over affected rows
        Me.Cells(rw.Row, PendingWriteCol).Value = "x"

        If rw.Column = RequestTypeCol Then
          Me.Cells(rw.Row, LastColToClear).ClearContents
        End If

    Next rw
End If
你能告诉我我做错了什么吗?

例如(下面是斯科特的评论):

Private子工作表\u更改(ByVal目标作为范围)
常量PendingWriteCol的长度=4
Const TestForChangeColRange=“A:C”
变暗rw As范围、rng As范围、rngTbl As范围
设置rngTbl=Me.Range(TestForChangeColRange)
设置rng=Application.Intersect(目标,rngTbl)'是否有受影响的受监控单元格?
如果不是,那么rng什么都不是
'扩展范围,以便我们可以按行标记,而不是按单元格标记
设置rng=Application.Intersect(rng.EntireRow,rngTbl)
对于rng.Rows中的每个rw,在受影响的行上循环
Me.Cells(rw.Row,PendingWriteCol).Value=“x”
下一个rw
如果结束
端接头
例如(根据斯科特的评论):

Private子工作表\u更改(ByVal目标作为范围)
常量PendingWriteCol的长度=4
Const TestForChangeColRange=“A:C”
变暗rw As范围、rng As范围、rngTbl As范围
设置rngTbl=Me.Range(TestForChangeColRange)
设置rng=Application.Intersect(目标,rngTbl)'是否有受影响的受监控单元格?
如果不是,那么rng什么都不是
'扩展范围,以便我们可以按行标记,而不是按单元格标记
设置rng=Application.Intersect(rng.EntireRow,rngTbl)
对于rng.Rows中的每个rw,在受影响的行上循环
Me.Cells(rw.Row,PendingWriteCol).Value=“x”
下一个rw
如果结束
端接头

您需要循环返回的范围:
Intersect(Target,Me.range(TestForChangeColRange))
然后逐行执行代码。Scott,谢谢。这有点过头了,你能举个例子吗?或者告诉我在哪里可以看到?我试图将其分配给一个变量,并在调试器中查看结果。我不知道如何从中提取行号。我看到了一个数组,我认为它包含了被拖动单元格的值,但我不知道如何判断哪些行,或者有多少行发生了拖动。您需要循环返回的范围:
Intersect(Target,Me.range(TestForChangeColRange))
,然后逐行执行代码。Scott,谢谢。这有点过头了,你能举个例子吗?或者告诉我在哪里可以看到?我试图将其分配给一个变量,并在调试器中查看结果。我不知道如何从中提取行号。我看到了一个数组,我想,它包含了被拖动单元格的值,但我不知道如何分辨哪些行,或者在拖动过程中发生了多少行。亲爱的,谢谢!我确实在处理循环中添加了Application.EnableEvents=False/True,因此它不会从正在写入的“x”重新触发工作表更改事件。非常感谢你帮我渡过难关。我忽略了这一点,因为“x”写在监控范围之外:它将重新触发处理程序,但它只是退出,不会造成无休止的循环。如果您添加了
EnableEvents=False
,那么还应该添加一个错误处理程序,以确保在出现运行时错误时不会将其关闭。我有一个后续问题。我把它贴在原来的问题上。还需要知道是否正在对某个特定列进行操作。您需要删除第二个Intersect,并通过cellRoger在rng单元上循环,谢谢。我刚刚发现我可以用同样的方式在列中进行后续循环。没有我想的那么优雅,但实际上是一样的。太好了,谢谢你!我确实在处理循环中添加了Application.EnableEvents=False/True,因此它不会从正在写入的“x”重新触发工作表更改事件。非常感谢你帮我渡过难关。我忽略了这一点,因为“x”写在监控范围之外:它将重新触发处理程序,但它只是退出,不会造成无休止的循环。如果您添加了
EnableEvents=False
,那么还应该添加一个错误处理程序,以确保在出现运行时错误时不会将其关闭。我有一个后续问题。我把它贴在原来的问题上。还需要知道某个特定的