我正在尝试编写一个更改任何列的宏 应该自动保存工作表。
我的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
下。
感谢任何帮助。
答案 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