VBA代码抛出运行时错误但仍然有效

时间:2017-09-28 22:47:50

标签: vba excel-vba excel

我编写了一个非常简单的VBA代码,如果填充了第2列,第1列和第4列为空,则使用当前日期填充第1列,使用当前时间填充第4列。

以下是我的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
  If (Target.Column = 2) And Target.Offset(0, -1).Value = "" Then
    Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
    Target.Offset(0, -1) = Date
    End If
  End Sub

并且它有效,但是当我填写第2列时,我会收到运行时错误,想法?

谢谢,

3 个答案:

答案 0 :(得分:3)

这是因为当在第一列中填充数据时,事件再次触发。这会导致错误,因为从第一列开始,.Offset(0,-1)

处没有列

要停止此分割,请将If拆分为嵌套if:

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Column = 2) Then
        If Target.Offset(0, -1).Value = "" Then
            Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
            Target.Offset(0, -1) = Date
        End If
    End If
End Sub

现在,如果它是任何其他列,则内部if将不会触发。

另一个建议是使用Application.EnableEvents暂时停止事件,这样我们就不会以递归方式触发:

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Column = 2) Then
        If Target.Offset(0, -1).Value = "" Then
            Application.EnableEvents = False
                Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
                Target.Offset(0, -1) = Date
            Application.EnableEvents = True
        End If
    End If
End Sub

答案 1 :(得分:2)

......投掷我的2c

Target可以是> 1个单元格,可能跨多个列,因此您需要考虑到这一点。还计划在运行时错误的情况下禁止事件处理被禁用(即使在这种情况下严格来说,您不需要关闭处理)。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng, c
    'only handle if change is in col2
    Set rng = Application.Intersect(Target, Me.Columns(2))

    If Not rng Is Nothing Then
        On Error GoTo haveError '<< ensure events are not left turned off
        Application.EnableEvents = False
        For Each c In rng.Cells
            If c.Offset(0, -1).Value = "" Then
                c.Offset(0, 2) = Format(Now(), "HH:MM:SS")
                c.Offset(0, -1) = Date
            End If
        Next c
    End If

haveError:
    Application.EnableEvents = True '<< switch event handling back on
End Sub

答案 2 :(得分:0)

Private Sub Worksheet_Change(ByVal Target As Range)
  If (Target.Column = 2) And Target.Offset(0, 2).Value = "" Then
    Target.Offset(0, 2) = Format(Now(), "HH:MM:SS")
    Target.Offset(0, -1) = Date
    End If
  End Sub

这将起作用并且不会抛出去除虫子。