循环迭代后程序冻结-Excel VBA for Loop

时间:2018-08-22 18:02:37

标签: excel vba excel-vba do-while

我正在尝试使用迭代来求解加速度方程;

a =((T * IE * i1 * ef1) / rdyn) - ((((IE + IT) * ((ifinal * i1) ^ 2) + 
IW) * a0) / ((rdyn) ^ 2)) - (mF * g * fR * Cos(Atn(0))) - (mF * g * 
Sin(Atn(0))) - (0.5 * ro * cW * A * ((V) ^ 2) / ((3.6) ^ 2));

其中我将a0用作迭代值,将a用作未来值。我使用了do while循环,程序非常简单。我发现收敛到一个值大约需要3或4次迭代。问题是,当它计算excel的最终值时会冻结。

我似乎找不到问题。任何人都可以发现什么地方出问题了吗?

    Sub IteracaoAceleracao()

Dim FZA, inertia, Rollresist, FSt, FL, T, ifinal, i1, ef1, rdyn, IE, IT, IW, mF, g, fR, ro, cW, A, V, a0, e, c As Double

a0 = 0
e = 1
c = 0

T = Sheets("T.Pot x n DADOS").Range("C5")
ifinal = Sheets("Dados carro.motor.transm").Range("D21")
i1 = Sheets("Dados carro.motor.transm").Range("D16")
ef1 = Sheets("Dados carro.motor.transm").Range("E16")
rdyn = Sheets("Dados carro.motor.transm").Range("D5")
IE = Sheets("Dados carro.motor.transm").Range("J4")
IT = Sheets("Dados carro.motor.transm").Range("J5")
IW = Sheets("Dados carro.motor.transm").Range("J3")
mF = Sheets("Dados carro.motor.transm").Range("D2")
g = 9.81
fR = Sheets("T.Pot x n DADOS").Range("A36")
ro = Sheets("Dados carro.motor.transm").Range("D25")
cW = Sheets("Dados carro.motor.transm").Range("D3")
A = Sheets("Dados carro.motor.transm").Range("D4")
V = Sheets("T.Pot x n DADOS").Range("A22")
FZA = (T * ifinal* i1 * ef1) / rdyn
inertia = (((IE + IT) * ((ifinal * i1) ^ 2) + IW) * a0) / ((rdyn) ^ 2)
Rollresist = mF * g * fR * Cos(Atn(0))
FSt = mF * g * Sin(Atn(0))
FL = 0.5 * ro * cW * A * ((V) ^ 2) / ((3.6) ^ 2)

Do While e > 0.00155


Sheets("FZ,Ex aceleração").Range("L4") = (FZA - inertia - Rollresist - FSt - FL) / mF

e = Sheets("FZ,Ex aceleração").Range("L4") - ax0
e = Abs(e)
a0 = Sheets("FZ,Ex aceleração").Range("L4")

Loop

End Sub

1 个答案:

答案 0 :(得分:0)

第35行的ax0看起来非常可疑

e = Sheets("FZ,Ex aceleraçao").Range("L4") - ax0

也许应该是

e = Sheets("FZ,Ex aceleraçao").Range("L4") - a0

该代码非常不可读。做类似的事情:

Dim a0 as Double
Const g as Double = 9.81
Dim shDados as Worksheet    
Set shDados = Sheets("Dados carro.motor.transm") 
ifinal = shDados.range("D21")

等...

希望这对您有所帮助。继续努力。