Excel Worksheet_Change事件无法正常工作

时间:2011-11-09 21:26:34

标签: excel excel-vba vba

我正在尝试编写一个更改任何列的宏 应该自动保存工作表。

我的Excel表格会扩展到G25

我尝试了这个,但它不起作用:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("G25")) Is Nothing Then
        ActiveWorkbook.Save
End Sub

我已将其保存在ThisWorkBook下。

感谢任何帮助。

2 个答案:

答案 0 :(得分:13)

ThisWorkbook 下,该处理程序名为Workbook_SheetChange并且它接受两个参数, Sh (类型Object)和目标< / strong>(a Range)。所以,你的代码不会在那里工作。
如果您将代码放在所需的工作表中(例如 Sheet1 )而不是 ThisWorkbook ,请放置End If并将范围更改为“A1:G25”(表示从第1行A列到第25行第25列的正方形),它应该可以工作。 这样做了:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("A1:G25")) Is Nothing Then
        MsgBox "changed"
    End If
End Sub

为了完整性,在 ThisWorkbook 下,这将有效:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("A1:G25")) Is Nothing Then
        MsgBox "changed"
    End If
End Sub

答案 1 :(得分:10)

事件不起作用的另一个常见原因是EnableEvents已设置为False

我会把你的问题编码为

  • 通常您需要处理正在测试的兴趣范围。因此,在下面创建变量rng1既可以作为早期退出点,也可以作为要使用的范围对象。在工作表事件Target.Worksheet.Range("A1:G25")将起作用,但实际使用时间很长
  • 如果您确实需要操作范围,则对工作表进行任何进一步更改将触发调用Change事件等,这可能导致Excel崩溃。因此,最好禁用其他事件,运行代码,然后在退出时重新启用事件

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng1 As Range
    Set rng1 = Intersect(Target, Range("A1:G25"))
    If rng1 Is Nothing Then Exit Sub
    Application.EnableEvents = False
    'work with rng1
    Application.EnableEvents = True
    End Sub