如果另一个单元格具有某个字符串值,我试图将一个单元格中的值乘以一个数字。但是,代码不断崩溃,我不确定什么地方出错了。在拥有一个简单的子控件之前,它可以正常工作,但是后来我将其更新为一个事件子控件,以便当字符串值更改时,单元格将自动更新。
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
答案 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中的值时,代码才会运行,这不会使自身循环破坏。