结束如果没有阻止如果错误 VBA



我编写这段代码是为了尝试根据使用 vba 的 Rnd(( 函数和 if 语句生成的另一个变量的值为变量赋值,但由于某种原因,它给了我"如果没有块,如果错误,则结束"。这只是代码的一部分,我为 5 种不同的产品迭代了 5 次此过程,并对聚合结果的数字生成器进行了 10000 次迭代。最初我尝试以这种方式嵌套所有内容,但是当这不起作用时,我尝试做单个 if 语句和相同的交易。 对此的任何帮助都会很棒。

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

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 所建议的那样,更好的选择是使用 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是从哪里来的,没关系( ProdE的值和DaysLateE之间似乎存在直接的线性关系 - 您可以尝试提出一个公式来计算它。

这可能并不完美,但非常接近:

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

然后你不需要IfSelect块。

问题是你在那里的最后If陈述。将If语句全部放在一行上而没有End If是完全有效的语法。 因此,当您将该End If放在那里时,它期待一个If语句,后面有行。

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

If TotalDaysLate > 15 then CountE = CountE + 1

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

试试这个: 我建议在这样的情况下使用选择大小写

    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

当你使用单行 ifs 时,你不需要写 End if。检查这个: https://msdn.microsoft.com/en-us/library/office/gg251599.aspx

考虑到您的分支和条件路径,以及 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

最新更新