2016-02-11 192 views
1

我编写了这段代码,尝试根据使用vba的Rnd()函数生成的另一个变量的值为变量赋值,如果语句由于某种原因而给出“结束如果没有阻止,如果错误。“这只是代码的一部分,我针对5种不同的产品对该过程进行了5次迭代,并对数字生成器进行了10000次迭代,从而对结果进行了汇总。起初,我试图以这种方式嵌套一切,但是当这没有奏效时,我试着做单一的if语句和相同的处理。任何帮助,这将是非常棒的。End If without Block如果错误VBA

For i = 0 To 10000 

ProdE = Rnd() 
ProdF = Rnd() 
ProdG = Rnd() 
ProdH = Rnd() 
ProdI = Rnd() 

If ProdE <= 0.1 Then DaysLateE = 2 
If 0.1 < ProdE <= 0.2 Then DaysLateE = 3 
If 0.2 < ProdE <= 0.3 Then DaysLateE = 4 
If 0.3 < ProdE <= 0.4 Then DaysLateE = 5 
If 0.4 < ProdE <= 0.5 Then DaysLateE = 6 
If 0.5 < ProdE <= 0.6 Then DaysLateE = 7 
If 0.6 < ProdE <= 0.7 Then DaysLateE = 8 
If 0.7 < ProdE <= 0.8 Then DaysLateE = 9 
If 0.8 < ProdE <= 0.9 Then DaysLateE = 10 
If 0.9 < ProdE <= 1 Then DaysLateE = 11 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 


TotalDaysLateE = DaysLateE + 8 
SumDaysLateE = SumDaysLateE + TotalDaysLateE 

If TotalDaysLateE > 15 Then CountE = CountE + 1 
End If 
+2

您不使用End If与此If形式的语句(其中动作在同一行中指定)。这是一个独立的单行声明。 –

回答

1

问题是您的最终If声明那里。在没有End If的情况下,在一行中全部使用If语句是完全有效的语法。所以当你把那个End If放在那里的时候,它预计会有一条If声明。

这两个将是有效的没有一个错误

If TotalDaysLate > 15 then CountE = CountE + 1 

或者

If TotalDaysLate > 15 Then 
    CountE = CountE + 1 
End If 
1

试试这个:我会建议使用Select Case incases这样

For i = 0 To 10000 

ProdE = Rnd() 
ProdF = Rnd() 
ProdG = Rnd() 
ProdH = Rnd() 
ProdI = Rnd() 

If ProdE <= 0.1 Then 
DaysLateE = 2 
End If 

If 0.1 < ProdE And ProdE <= 0.2 Then 
DaysLateE = 3 
End If 

If 0.2 < ProdE And ProdE <= 0.3 Then 
DaysLateE = 4 
End If 

If 0.3 < ProdE And ProdE <= 0.4 Then 
DaysLateE = 5 
End If 

If 0.4 < ProdE And ProdE <= 0.5 Then 
DaysLateE = 6 
End If 

If 0.5 < ProdE And ProdE <= 0.6 Then 
DaysLateE = 7 
End If 

If 0.6 < ProdE And ProdE <= 0.7 Then 
DaysLateE = 8 
End If 

If 0.7 < ProdE And ProdE <= 0.8 Then 
DaysLateE = 9 
End If 

If 0.8 < ProdE And ProdE <= 0.9 Then 
DaysLateE = 10 
End If 

If 0.9 < ProdE And ProdE <= 1 Then 
DaysLateE = 11 
End If 


TotalDaysLateE = DaysLateE + 8 
SumDaysLateE = SumDaysLateE + TotalDaysLateE 

If TotalDaysLateE > 15 Then 
CountE = CountE + 1 
End If 
+0

vba不允许X

+0

哦,yess,我没有想过,我认为只是如果结束是一个问题将纠正它谢谢 – newguy

+0

我会upvote这个答案建议'Select Case',但我也downvote它使OP的代码更糟它已经是'If ... End If'块。 –

2

If的语法允许两种变体:

  1. “内联”

    If {bool-expression} Then {do something} 
    
  2. “块”

    If {bool-expression} Then 
        {do something} 
    End If 
    

End If令牌是非法的,当你正在使用的 “内联” 的语法。

所以这(即去除End If令牌)使你的代码重新编译:

If ProdE <= 0.1 Then DaysLateE = 2 
If 0.1 < ProdE <= 0.2 Then DaysLateE = 3 
If 0.2 < ProdE <= 0.3 Then DaysLateE = 4 
If 0.3 < ProdE <= 0.4 Then DaysLateE = 5 
If 0.4 < ProdE <= 0.5 Then DaysLateE = 6 
If 0.5 < ProdE <= 0.6 Then DaysLateE = 7 
If 0.6 < ProdE <= 0.7 Then DaysLateE = 8 
If 0.7 < ProdE <= 0.8 Then DaysLateE = 9 
If 0.8 < ProdE <= 0.9 Then DaysLateE = 10 
If 0.9 < ProdE <= 1 Then DaysLateE = 11 

然而,随着@Rohan K suggested,更好的选择是使用一个Select Case结构,因为现在,所有这些条件始终被评估 - 带有Select Case块,执行将在找到匹配条件后退出Select块,并且作为奖励获得可读性:

Select Case ProdE 
    Case Is <= 0.1 
     DaysLateE = 2 
    Case Is <= 0.2 
     DaysLateE = 3 
    Case Is <= 0.3 
     DaysLateE = 4 
    Case Is <= 0.4 
     DaysLateE = 5 
    Case Is <= 0.5 
     DaysLateE = 6 
    Case Is <= 0.6 
     DaysLateE = 7 
    Case Is <= 0.7 
     DaysLateE = 8 
    Case Is <= 0.8 
     DaysLateE = 9 
    Case Is <= 0.9 
     DaysLateE = 10 
    Case Is <= 1 
     DaysLateE = 11 
    Case Else 
     'DaysLateE = ?? 
End Select 

那么,当ProdE大于或等于1时会发生什么?(没有读过其中ProdE从,请不要介意来)似乎还有的ProdEDaysLateE值之间的直线线性关系 - 你可以尝试拿出一个公式来计算代替。

这可能是不完美的,但出来的结果很接近:

DaysLateE = Int(ProdE * 10 - 0.000000000001) + 2 

然后你不需要IfSelect块。

0

考虑你的分支和条件路径,并且对于10000次迭代,我建议分叉你的If... Then声明。更好的是,将这与两个较小的Case... Select结合使用,以获得所有建议的可读组合。更快!

If ProdE <= 0.5 Then 
    If ProdE <= 0.1 Then DaysLateE = 2 
    If 0.1 < ProdE <= 0.2 Then DaysLateE = 3 
    If 0.2 < ProdE <= 0.3 Then DaysLateE = 4 
    If 0.3 < ProdE <= 0.4 Then DaysLateE = 5 
    If 0.4 < ProdE <= 0.5 Then DaysLateE = 6 
Else 
    If 0.5 < ProdE <= 0.6 Then DaysLateE = 7 
    If 0.6 < ProdE <= 0.7 Then DaysLateE = 8 
    If 0.7 < ProdE <= 0.8 Then DaysLateE = 9 
    If 0.8 < ProdE <= 0.9 Then DaysLateE = 10 
    If 0.9 < ProdE <= 1 Then DaysLateE = 11 
End If