上次修改跟踪的基本IF语句错误

时间:2017-07-14 13:26:21

标签: excel vba excel-vba

我是一名新手编码器,最近摆脱了基于网络的编码,并且我的脚本出错了。我已经可以说这个脚本很糟糕,并且想知道我是否能得到任何帮助。

此脚本应该在等于该范围内的任何单元格更改后,将等效的偏移单元格设置为当前时间和日期。我相信我糟糕的脚本要么导致循环,要么错误计算信息,因为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

2 个答案:

答案 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列。

相关问题