«иначе без if» получить эту ошибку в Excel VBA - PullRequest
0 голосов
/ 14 апреля 2019

Я получаю сообщение об ошибке «иначе без if» в приведенном ниже коде.Может кто-нибудь помочь, пожалуйста?

For I = 2 To LR5
   If (Range("Ae" & I).Value = 5 & Range("x" & I).Value = 2 & Range("y" & I).Value = 2) Then Range("ah" & I).Value = "30000"
   ElseIf (Range("Ae" & I).Value = 5 & Range("x" & I).Value = 4 & Range("y" & I).Value = 4) Then Range("ah" & I).Value = "60000"
   ElseIf Range("Ae" & I).Value = "29" Then Range("ah" & I).Value = "10000"
   ElseIf Range("Ae" & I).Value = "30" & Range("x" & I).Value = "4" Then Range("ah" & I).Value = "80000"
   ElseIf Range("Ae" & I).Value = "30" & Range("x" & I).Value = "2" Then Range("ah" & I).Value = "50000"
   ElseIf Range("Ae" & I).Value = "17" & Range("x" & I).Value = "2" Then Range("ah" & I).Value = "60000"
   ElseIf Range("E" & I).Value = "RRUS11" Then Range("AH" & I).Value = "80000"
   ElseIf Range("E" & I).Value = "RRUS11+RRUSA2" Then Range("AH" & I).Value = "80000"
   ElseIf Range("E" & I).Value = "RRUS12" Then Range("AH" & I).Value = "120000"
   End If
Next

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

TL; DR: Вам нужно переместить все после Then на новую строку.


В VBA однострочные If -статистики имеют следующие характеристики:

  • У них нет End If, никогда .
  • Они должны быть записаны целиком одной строкой. 1

Например:

If someCondition Then DoSomething
If someCondition Then DoSomething Else DomeSomethingElse
If someCondition Then DoSomething(x) Else If anotherCondition Then DoSomething(y) Else DoSomething(z)

Тем не менее, одна строка - if должна использоваться исключительно для коротких выписок. Как правило, не рекомендуется использовать его, когда у вас есть Else (не говоря уже о Else If). Таким образом, в приведенном выше блоке кода второй и третий примеры не рекомендуются. Вместо этого вы должны написать свои If заявления, как это:

If someCondition Then
    DoSomething (x)
Else If anotherCondition Then
    DoSomething (y)
Else
    DoSomething (z)
End If

1 Вы можете, конечно, разбить операторы на несколько строк, используя _. Подробнее см. .

0 голосов
/ 14 апреля 2019

в логическом выражении, которое вы хотите использовать AND вместо &

кроме того, в таком запутанном случае блок Select Case гораздо более читабелен:

For I = 2 To LR5
    Select Case True
        Case Range("Ae" & I).Value = 5 And Range("x" & I).Value = 2 And Range("y" & I).Value = 2
            Range("ah" & I).Value = "30000"
        Case Range("Ae" & I).Value = 5 And Range("x" & I).Value = 4 And Range("y" & I).Value = 4
            Range("ah" & I).Value = "60000"
        Case Range("Ae" & I).Value = "29"
            Range("ah" & I).Value = "10000"
        Case Range("Ae" & I).Value = "30" And Range("x" & I).Value = "4"
            Range("ah" & I).Value = "80000"
        Case Range("Ae" & I).Value = "30" And Range("x" & I).Value = "2"
            Range("ah" & I).Value = "50000"
        Case Range("Ae" & I).Value = "17" And Range("x" & I).Value = "2"
            Range("ah" & I).Value = "60000"
        Case Range("E" & I).Value = "RRUS11"
            Range("AH" & I).Value = "80000"
        Case Range("E" & I).Value = "RRUS11+RRUSA2"
            Range("AH" & I).Value = "80000"
        Case Range("E" & I).Value = "RRUS12"
            Range("AH" & I).Value = "120000"
        Case Else
            ' put code to handle the case when no preceeding conditions are met
    End Select
Next

и вот еще один способ перевода того же самого If Then Else If вашего в Select Case блок:

For I = 2 To LR5

    Select Case Range("Ae" & I).Value

        Case 5
            Select Case True
                Case Range("x" & I).Value = 2 And Range("y" & I).Value = 2
                    Range("ah" & I).Value = "30000"
                Case Range("x" & I).Value = 4 And Range("y" & I).Value = 4
                    Range("ah" & I).Value = "60000"
            End Select

        Case "29"
            Range("ah" & I).Value = "10000"

        Case "30"
            Select Case Range("x" & I).Value
                Case "4"
                    Range("ah" & I).Value = "80000"
                Case "2"
                    Range("ah" & I).Value = "50000"
            End Select
        Case "17"
            If Range("x" & I).Value = "2" Then Range("ah" & I).Value = "60000"

        Case Else
            Select Case Range("E" & I).Value
                csse "RRUS11", "RRUS11+RRUSA2"
                    Range("AH" & I).Value = "80000"

                Case "RRUS12"
                    Range("AH" & I).Value = "120000"

                Case Else
                    ' you may want to put code to handle the case when no preceeding condition is met
            End Select

    End Select

Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...