我是一名新手编码器,最近摆脱了基于网络的编码,并且我的脚本出错了。我已经可以说这个脚本很糟糕,并且想知道我是否能得到任何帮助。
此脚本应该在等于该范围内的任何单元格更改后,将等效的偏移单元格设置为当前时间和日期。我相信我糟糕的脚本要么导致循环,要么错误计算信息,因为excel在事件触发后崩溃。
非常感谢任何帮助。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("E5:E100")) Is Nothing Then
Target.Offset(0, 3) = Now()
Target.Offset(0, -1) = Target.Offset(0, -1).Value + 1
Else
If Intersect(Target, Range("F5:F100")) Is Nothing Then Exit Sub
Target.Offset(0, 2) = Now()
Target.Offset(0, -1) = Target.Offset(0, -1).Value + 1
End If
End Sub
答案 0 :(得分:1)
当您更改工作表上的值然后再次触发事件并且它继续循环直到excel崩溃时,您需要临时停止事件发生。
把
Application.EnableEvents = False
一开始并确保添加
Application.EnableEvents = True
最后将它们重新打开。
所以:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E5:E100")) Is Nothing Then
Application.EnableEvents = False
Target.Offset(0, 3) = Now()
Target.Offset(0, -1) = Target.Offset(0, -1).Value + 1
Application.EnableEvents = True
Else
If Not Intersect(Target, Range("F5:F100")) Is Nothing Then
Application.EnableEvents = False
Target.Offset(0, 2) = Now()
Target.Offset(0, -1) = Target.Offset(0, -1).Value + 1
Application.EnableEvents = True
End If
End Sub
答案 1 :(得分:1)
使用If Intersect(Target, Range("E5:E100")) Is Nothing
作为标准,检查目标是否与您的范围相交。我将假设,根据您使用的偏移量,您实际上只对列E和F感兴趣。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'prevent event re-firing based on changes made by the event
If Not (Intersect(Target, Range("E5:F100")) Is Nothing) Then
Target.Offset(0, (7 - Target.Column)) = Now()
Target.Offset(0, -(Target.Column - 4)) = Target.Offset(0, -(Target.Column - 4)).Value + 1
End If
Application.EnableEvents = True 'allows event to fire again
End Sub
因此,为了澄清,上面查找列E或F(第5行到第100行)的更改,如果有人将日期戳写入G列中的同一行,将计数器写入D列。