Я предполагаю, что причина
Private Sub Worksheet_Change(ByVal Target As Range)
.
Этот код запускается при каждом изменении значения.
И сам код изменяет значения, что означает, что он вызывает функцию снова и снова и снова.
Обязательно выключите вычисления, прежде чем изменять значения в этой функции.
Либо вручную, либо с помощью Application.calculation = xlCalculationManual
Вы также можете установить целевой диапазон.
Если у вас есть конкретная ячейка, которую вы используете в качестве «триггера», вы можете использовать if like:
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, это не приведет к уничтожению самого цикла.