Excel Worksheet_Change事件无法正常工作

use*_*194 13 excel vba excel-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
Run Code Online (Sandbox Code Playgroud)

我保存下来了ThisWorkBook.

任何帮助表示赞赏.

ssa*_*ndo 14

ThisWorkbook下调用处理程序Workbook_SheetChange并接受两个参数:Sh(类型Object)和目标(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
Run Code Online (Sandbox Code Playgroud)

为了完整性,在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
Run Code Online (Sandbox Code Playgroud)

  • 或者更简洁一点`Intersect(Target,Sh.[A1:G25])` (2认同)

bre*_*tdj 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
    
    Run Code Online (Sandbox Code Playgroud)