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

Find all cells changed with paste or drag

设置:

从具有 3 列的 sheet 开始。 “ID”、“MyNote”、“MyDate”headers。这个sheet可能有几千行数据。

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

通常情况下,用户会 change/update 在 session 中只有几行。所以我不想处理 sheet 中的每一行,尤其是那些没有变化的行。

我现在的工作:

我已经通过在用户进行更改时将“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) 使用其他工作簿中的粘贴时,问题就出现了,在这两种情况下,不止一个单元格被更改一次。

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

我试图找到其他类似的拦截Copy/Paste等解决方案,但我无论如何也看不到发现如果复制,哪些单元格受到影响。

需要:

我只需要知道哪些行号受到拖动或 copy/paste 的影响。如果我能准确地将这些行标记为已更新,那我就成功了。

FOLLOW-UP

使用蒂姆的解决方案。无法将某些东西重新融入其中。 此外,我需要能够检查特定列是否被编辑,如果是,则清除不同的列。例如,如果编辑了 Col 2,则清除 Col 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

你能告诉我我做错了什么吗?

例如(根据 Scott 的评论):

Private Sub Worksheet_Change(ByVal Target As Range)
    Const PendingWriteCol As Long = 4
    Const TestForChangeColRange = "A:C"
    
    Dim rw As Range, rng As Range, rngTbl As Range
    
    Set rngTbl = Me.Range(TestForChangeColRange)
    Set rng = Application.Intersect(Target, rngTbl) 'any monitored cells affected?
    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"
        Next rw
    End If
End Sub