I can't disagree that a loop would be a good idea. For the time being, let me scale it down and determine what can be done with the automatic update. How about this.

[VBA]Function max(e1)

e1t_1 = Range("e_allow_1").Offset(0, 0).Value
e1c_1 = Range("e_allow_1").Offset(1, 0).Value

If (e1 > 0) Then
max = e1t_1 / e1 - 1
ElseIf (e1 = 0) Then
max = 999
ElseIf (e1 < 0) Then
max = e1c_1 / e1 - 1

End Function
[/VBA]
How can you get the function to update when "e_allow_1" changes, but keep in mind that this is a condensed version and the actual version will have more variables (i.e. an elegant solution would be good).