2016-02-11 4 views
1

Я написал этот код, чтобы попытаться присвоить значение переменной на основе значения другой переменной, сгенерированной с помощью функции Vnd Rnd(), и если они почему-то дают мне «конец» если без блока, если ошибка. " Это всего лишь часть кода, я повторяю этот процесс 5 раз для 5 разных продуктов и выполняю 10000 итераций генераторов чисел, суммирующих результаты. Первоначально я попробовал это так, чтобы вложить все, но когда это не сработало, я пробовал делать одиночные заявления и одну и ту же сделку. Любая помощь с этим была бы потрясающей.Конец Если без блока Если ошибка 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. Весьма правдоподобный синтаксис, чтобы иметь оператор If все на одной строке без End 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

Ohh yess, я не думал об этом, я думал, что если бы конец был проблемой, исправит его. Спасибо – newguy

+0

Я бы поднял этот ответ за предложение 'Select Case', но я также уменьшил его, чтобы сделать код 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 после нахождения подходящего условия, а в качестве бонуса вы получите readabiilty:

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 

И тогда вам не нужно IfилиSelect блоков.

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 
Смежные вопросы