问题描述
设置:
从包含 3 列的工作表开始。 “ID”、“MyNote”、“MyDate”标题。此工作表可能有数千行数据。
我需要“标记”用户对行上的任何内容进行更改的任何行。在其他代码中,标记的行将依次用于更新我的 sql 服务器上的表。
通常情况下,用户在会话中只会更改/更新几行。所以我不想处理工作表中的每一行,尤其是那些没有变化的行。
我现在的工作:
我通过在用户进行更改时将“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 只会看到第一个单元格,而不会看到任何通过拖动或粘贴进行编辑的额外单元格。
我试图找到其他类似的解决方案来拦截复制/粘贴等,但无论如何我都看不到如果复制了,哪些单元格受到了影响。
需要:
我只需要知道哪些行号受到拖动或复制/粘贴的影响。如果我能准确地将这些行标记为已更新,我就可以开展业务了。
跟进
使用 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
你能告诉我我做错了什么吗?
解决方法
例如(继 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