MS Excel工作表更改事件 - 将旧单元格值的记录与新值

时间:2016-02-19 18:05:51

标签: excel vba excel-vba

我是这个论坛的新手,但由于我当前角色的VBA要求,过去几个月我一直在积累我的编码经验。今天的问题已经让我在许多网站上搜寻(以及我的Excel VBA for Dummies书),但我还没有完全固定它。

我正在尝试在Excel中为我们公司的风险登记制作审计跟踪文件。这个想法是,一旦风险登记册建立,任何改变都将创建一个审计跟踪(在单独的选项卡上),显示旧记录和新记录。

我使用Change Event处理程序编写了代码。我希望每次发生变化时都会触发宏,并执行以下操作:
1。参考旧单元格值(用户刚刚覆盖的内容)
2。跳转到审计线索'选项卡并粘贴完整风险记录的两个副本 - 每个风险记录是占据17列的一行数据
3. 在这17列的第一个副本中,确定编辑了哪个列,并将此单元格替换为旧单元格值(在步骤1中捕获)
4. 插入时间戳
5. 让条件格式突出显示已更改的记录[代码中不需要此功能,因为我已在电子表格中设置了它]
6。跳回用户刚进行编辑的单元格(在' Risk Register'标签上)

我已经管理了第1步,第2步和第4-7步,但是我遇到了输入"旧单元格值的问题"进入“审计追踪器”的正确位置标签。如果我手动定义要粘贴的单元格范围,我可以在那里得到它,但我似乎无法使其动态化,以便它会自动识别用户正在更改的字段并确保修改相同的字段审计线索。

非常感谢有关为什么" PasteRange.Value =工作表("风险登记册")的任何见解。范围(" oldValuePaste")"线路还没有工作

我的代码如下:

    Dim oldValue As Variant
    Dim LastRow As Long
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Application.ScreenUpdating = False
            If Not Intersect(Target, Range("b13:r13")) Is Nothing Then
                oldValue = Target.Value
            End If
        Application.ScreenUpdating = True
    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.ScreenUpdating = False

    If Not Intersect(Target, Range("b13:r14")) Is Nothing Then
        If Target.Value <> oldValue Then
            'MsgBox "You just changed " & Target.Address
             Cells(65, 5).Value = oldValue       'this cell is a named range called: OldValuePaste
             Cells(66, 5).Value = Target.row     'this cell is a named range called: OldValueRowNumber
             Cells(67, 5).Value = Target.Column  'this cell is a named range called: OldValueColumnNumber

            Range(Cells(Target.row, 2), Cells(Target.row, 18)).Copy
            'Cells(70, 2).PasteSpecial xlPasteValues

            Call Paste_on_AuditSheet
            Sheets("Risk Register").Activate
            Target.Select
            Application.CutCopyMode = False

        End If
    End If

Application.ScreenUpdating = True
End Sub

_____________________________________________________________________________________________________

Sub Paste_on_AuditSheet()
Application.ScreenUpdating = False
Dim LastRow As Long
Dim ColNum As Long
Dim PasteRange As Range
ColNum = OldValueColumnNumber

    Sheets("Audit trail").Select
    'MsgBox "Activated " & ActiveSheet.Name

        'Find the last used row in a Column: column B in this example
        With ActiveSheet
            LastRow = .Cells(.Rows.Count, "B").End(xlUp).row
        End With

    Set PasteRange = Cells(LastRow, ColNum)

'The following two lines bring in the new data and paste into old record and new record sections:
        Cells(LastRow + 1, 2).PasteSpecial xlPasteValues
        Cells(LastRow + 1, 20).PasteSpecial xlPasteValues

'Then this line goes back over the piece just pasted in and changes one cell in "old record" section to what it was prior to the edit:
        'PasteRange.Value = Worksheets("Risk Register").Range("oldValuePaste")
'Above line of code is not working, but can get it to do the right thing using this code (although it's not dynamic):
        Range("E3").Value = Worksheets("Risk Register").Range("oldValuePaste")

'Add a time stamp:
    Cells(LastRow + 1, 1) = Now

Application.ScreenUpdating = True
End Sub

最后一点 - 尽管我多次使用Application.ScreenUpdating命令,但我仍然会看到一些屏幕闪烁 - 为什么会有任何想法?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在审核您的代码时,我看到了一些我认为不会按照您的意愿工作的内容,并且还认识到您的代码可以变得更简单,只需从{{1}调用事件。

下面重构的代码,如果您有问题,请告诉我们:

Worksheet_Change