事件处理程序过程,用于在更改之前和之后记录选定单元格中的所有值

时间:2013-12-20 11:12:56

标签: excel vba event-handling

我正在尝试创建一个自动过程,每次用户更改工作表上单元格中的值时都会激活该过程。我已设法创建一个过程,如果一个单元格被更改,将记录该值,但如果用户粘贴在几个单元格中,则只会更改它们所选择的第一个单元格。这就是我到目前为止,任何指导都将受到赞赏。

Option Explicit
Dim OldCellValue As String

' Get Windows Username
Function Usernam() As String
    Usernam = Environ("username")
End Function

' Record the current cell value.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    OldCellValue = ActiveCell.Text
End Sub

'Paste the original value and new value into the next free row on sheet3
'with Windows username, date and time     
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Lstrow As Long
Dim Changerow As Long

    Lstrow = Sheets("Sheet3").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
    Sheets("Sheet3").Range("A" & Lstrow).Value = Usernam
    Sheets("Sheet3").Range("B" & Lstrow).Value = Date
    Sheets("Sheet3").Range("C" & Lstrow).Value = Time
    Sheets("Sheet3").Range("D" & Lstrow).Value = "Sheet " & ActiveSheet.Name & _
        ", Range " & Target.Address & " Chanaged from """ & OldCellValue & _
        """  to """ & Target.Value & """"

End Sub

1 个答案:

答案 0 :(得分:0)

更新

这将向您展示如何将目标范围与多个单元格一起使用,但它无法解决您现在需要在内存中存储多个先前单元格范围的需要

我玩过

  • 保存先前范围的公共变量,
  • 然后处理单元格,如果Selection目标的地址与Change目标相同但是它非常笨拙

我认为您需要一种不同的方式来跟踪更改 - 例如在Selection上将当前值添加到单元格注释中。虽然仍然很混乱,但如果使用范围......

,任何单元格细胞更改对于Excel都会非常密集

原帖
您需要使用Target范围来处理每个单元格,即

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range
Dim rng2 As Range

Set rng1 = Sheets("Sheet3").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
For Each rng2 In Target
rng1.Resize(1, 4) = Array(Environ("username"), Date, Time, "Sheet " & ActiveSheet.Name & _
        ", Range " & rng2.Address & " Changed from """ & OldCellValue & _
        """  to """ & rng2.Value & """")
Next rng2
End Sub