Excel Worksheet_Change事件不起作用

我想写一个macros,在任何列更改应自动保存工作表。

我的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下。

任何帮助表示赞赏。

ThisWorkbook下 ,该处理程序称为Workbook_SheetChange ,它接受两个参数Sh (types为Object )和TargetRange )。 所以,你的代码不会在那里工作。
如果你把你的代码放在你想要的工作表(例如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 

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

我会像这样编码你的问题

  • 通常您需要处理正在testing的兴趣范围。 因此,在下面创build一个variablesrng1既可以作为早期的退出点,也可以作为一个范围对象来使用。 在一个表单事件Target.Worksheet.Range("A1:G25")将工作,但它是实际使用的冗长
  • 如果您确实有一个范围可以操作,那么对表格进行任何更改都会触发更改事件的调用等等,从而导致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