Excel “忽略”;下标超出范围“;错误一次,处理第一次迭代

Excel “忽略”;下标超出范围“;错误一次,处理第一次迭代,excel,vba,macos,Excel,Vba,Macos,我正在做一个循环,计算一个弹丸的轨迹,当弹丸与目标处于同一高度,并且弹丸处于适当的位置时,我希望循环停止。这由Do确保,直到。。。线路。但是,当循环开始时,y(i-2)不存在[y(-1)],导致“运行时错误'9'-下标超出范围”。使用“On Error Resume Next”(错误恢复下一步)确实允许循环继续,但我经常犯错误,并且在向循环添加更多内容(例如,移动目标、偏航、风等)时肯定会犯错误。出于这个原因,我希望vba只忽略一次运行时错误,并在出现以下任何错误时中断 守则的有关章节如下: v

我正在做一个循环,计算一个弹丸的轨迹,当弹丸与目标处于同一高度,并且弹丸处于适当的位置时,我希望循环停止。这由Do确保,直到。。。线路。但是,当循环开始时,y(i-2)不存在[y(-1)],导致“运行时错误'9'-下标超出范围”。使用“On Error Resume Next”(错误恢复下一步)确实允许循环继续,但我经常犯错误,并且在向循环添加更多内容(例如,移动目标、偏航、风等)时肯定会犯错误。出于这个原因,我希望vba只忽略一次运行时错误,并在出现以下任何错误时中断

守则的有关章节如下:

vx(0) = V * Cos(Theta)  'set the initial conditions
vy(0) = V * Sin(Theta)
vz(0) = 0
x(0) = 0
y(0) = 0
z(0) = 0
i = 1
t = 0

On Error Resume Next
Do Until y(i - 1) < TargetAlt And y(i - 1) < y(i - 2)   'Stop when the projectile is at the same height
                                                                                 'as the target AND the projectile in on the
                                                                                 'decent of its trajectory

    'If the projectile is moving up then drag and gravity are working together
    'If not drag is working against gravity.
    If vy(i - 1) > 0 Then
            vy(i) = vy(i - 1) + h * (-g - (DragCof * (vy(i - 1) ^ 2)))
    Else: vy(i) = vy(i - 1) + h * (-g + (DragCof * (vy(i - 1) ^ 2)))
    End If

    'The y position of the projectile
    y(i) = y(i - 1) + h * (vy(i - 1))

    'x direction velocity
    vx(i) = vx(i - 1) + h * (-DragCof * (vx(i - 1) ^ 2))
    'The x position of the projectile
    x(i) = x(i - 1) + h * (vx(i - 1))

    'z direction velocity
    'The z position of the projectile

    'parameters
    t = t + h
    i = i + 1

Loop
vx(0)=V*Cos(θ)”设置初始条件
vy(0)=V*Sin(θ)
vz(0)=0
x(0)=0
y(0)=0
z(0)=0
i=1
t=0
出错时继续下一步
直到y(i-1)0,则
vy(i)=vy(i-1)+h*(-g-(DragCof*(vy(i-1)^2)))
否则:vy(i)=vy(i-1)+h*(-g+(DragCof*(vy(i-1)^2)))
如果结束
'弹丸的y位置
y(i)=y(i-1)+h*(vy(i-1))
'x方向速度
vx(i)=vx(i-1)+h*(-DragCof*(vx(i-1)^2))
'弹丸的x位置
x(i)=x(i-1)+h*(vx(i-1))
'z方向速度
'弹丸的z位置
“参数
t=t+h
i=i+1
环

在i=2时启动循环并相应地调整初始条件可能会起作用,但如果可能的话,我希望避免这种情况。

在某些特殊情况下,除了在错误恢复时使用
下一步
进行流量控制外,别无选择-但这不是其中之一。在这种情况下,它只会给你带来痛苦

通过稍微改变一下逻辑,您可以更简单地处理第一次迭代的边缘情况。例如,停止条件检查可以移动到循环的底部,如下所示:

Do

    '... code to calculate projectile position at this time step...

    'Advance to next time step
    t = t + h
    i = i + 1

    'Get out when projectile falls below target height AND is on descent
Loop Until y(i - 1) < TargetAlt And y(i - 1) < y(i - 2)
Do
'... 在这个时间步计算弹丸位置的代码。。。
'前进到下一时间步
t=t+h
i=i+1
“当弹丸落在目标高度以下并处于下降状态时,退出
循环直到y(i-1)
您只需将
On Error GoTo 0粘贴到
Do Until
行之后,即可恢复默认错误处理。但这也是获得无限循环的一种简单方法。感谢堆,我忘记了这是可能的。