在Workbook_SheetChange事件中使用VBA

时间:2015-04-03 21:33:55

标签: vba excel-vba event-handling excel

我正在尝试创建特定工作表(名为" FORMULAS")中的特定范围(G2:G103)对其进行任何更改的日志。这是一个很多人每天多次查看的工作簿,对我来说,记录一下我可以在幕后跟踪的问题范围有所帮助。我希望更改日志包含在另一个工作表(名为" ActivityLog")中,从E列开始,带有username和now函数。

到目前为止,我编写的代码并没有返回错误,但根本没有做任何事情。我尝试了一个worksheet_change事件和一个workbook_sheetchange事件,并继续遇到同样的问题:没有做任何事情。关于我缺少什么以及我是否应该将代码放在" FORMULAS"中的任何想法。模块或在" ThisWorkbook"模块?

Application.EnableEvents = False
If Intersect(Target, Range("G2:G103")) Then
With Worksheets("ActivityLog")
Sheets("ActivityLog").Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value =    Environ("username")
Sheets("ActivityLog").Range("E" & Rows.Count).End(xlUp).Offset(0, 1).Value = Format(Now, "MM/dd/yyyy h:mm:ss_ AM/PM")
End With
End If
Application.EnableEvents = True

谢谢!

由于@Jeeped,现在已经回答了上述问题。然而,我决定采用这种方式遇到另一个问题。由于相关范围相当大,并且宏在任何时候发生更改时都会向ActivityLog工作表发送重复报告(因为单元格被激活,并且值已更改,我猜这就是它加倍的原因) ,我试图看看我是否可以缓解一个巨大的活动日志,如果我真的只想看看是否发生了变化(并且不一定发生了多少更改)。我有一个公式单元格来跟踪总变化的值,所以我认为这可能有用,并且宏一次触发然后再不起作用......任何想法? (这是工作表中的私有模块,我正在观看公式的单元格。)

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E14")) Is Nothing Then
Call Worksheet_Calculate
End If
Application.EnableEvents = True
End Sub

Sub Worksheet_Calculate()
Static oldval
If Range("E14").Value <> oldval Then
oldval = Range("E14").Value
Application.EnableEvents = False
With Worksheets("ActivityLog")
.Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = Environ("username")
.Range("E" & Rows.Count).End(xlUp).Offset(0, 1).Value = Format(Now, "MM/dd/yyyy h:mm:ss_ AM/PM")
    End With

End If
End Sub

谢谢!

1 个答案:

答案 0 :(得分:1)

我对您的代码的原始评估有点仓促。检查目标是否在G2范围内:G103应该检查If Not Intersect(Target, Range("G2:G103")) Is Nothing,而不仅仅是Intersect。除此之外,该代码看起来很好。 (With ... End With是多余的,但不应该阻止它运行)

  

在工作表代码表或ThisWorkbook工作簿代码表中的Workbook_SheetChange中使用Worksheet_Change事件宏。他们都可以在那里做不同的事情,但他们不应该同时尝试做同样的事情。从下面提供的两个中选择一个。

在FORMULAS工作表代码表中:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("G2:G103")) Is Nothing Then
        Application.EnableEvents = False
        With Worksheets("ActivityLog")
            .Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = Environ("username")
            .Range("E" & Rows.Count).End(xlUp).Offset(0, 1).Value = Format(Now, "MM/dd/yyyy h:mm:ss_ AM/PM")
        End With
    End If
    Application.EnableEvents = True
End Sub

在ThisWorkBook工作簿代码表中:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "FORMULAS" Then
        If Not Intersect(Target, Sh.Range("G2:G103")) Is Nothing Then
            Application.EnableEvents = False
            With Worksheets("ActivityLog")
                .Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = Environ("username")
                .Range("E" & Rows.Count).End(xlUp).Offset(0, 1).Value = Format(Now, "MM/dd/yyyy h:mm:ss_ AM/PM")
            End With
        End If
    End If
    Application.EnableEvents = True
End Sub

但是,.EnableEventws是否卡在False的问题仍然有效。你有没有先前的尝试和中途崩溃?转到VBE的立即窗口(Ctrl + G)并粘贴Application.EnableEvents = True然后按Enter键。如果在前一代码中途发生崩溃,则EnableEvents可能会停留在False。