我的自动将单元格乘以值的代码不断崩溃

时间:2019-04-25 20:06:17

标签: excel vba

如果另一个单元格具有某个字符串值,我试图将一个单元格中的值乘以一个数字。但是,代码不断崩溃,我不确定什么地方出错了。在拥有一个简单的子控件之前,它可以正常工作,但是后来我将其更新为一个事件子控件,以便当字符串值更改时,单元格将自动更新。

Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
        If cell.Value = "gallons" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
        ElseIf cell.Value = "m3" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
        End If
    Next
End Sub

2 个答案:

答案 0 :(得分:2)

除非您在运行任何更新之前禁用了事件,否则您对子项所做的每个更改都会再次触发该事件。

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error Goto haveError
    Application.EnableEvents = False
    For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
        If cell.Value = "gallons" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
        ElseIf cell.Value = "m3" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
        End If
    Next

haveError:
    Application.EnableEvents = True

End Sub

答案 1 :(得分:0)

我认为原因是
Private Sub Worksheet_Change(ByVal Target As Range)

每次值更改时都运行此代码。
代码本身会更改值,这意味着它会一次又一次地调用该函数。

在更改此函数中的值之前,请确保关闭计算。
手动或使用Application.calculation = xlCalculationManual

您还可以设置目标范围。
如果您有一个特定的单元格用作“触发”,则可以使用if:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
            If cell.Value = "gallons" Then

cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
            ElseIf cell.Value = "m3" Then

cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
            End If
        Next
    End If
End Sub

这意味着仅当您更改A1中的值时,代码才会运行,这不会使自身循环破坏。