VBA - оператор elseif пропускает ElseIf

В следующем коде код работает, но пропускает строку «else if»: ElseIf y = "BAS" then "Basingstoke".

Поскольку Basingstoke следует за Белфастом в массиве, из которого исходит Y, он сохраняет «Белфаст» в качестве значения «Регион». Он отлично работает, но просто полностью пропускает строку ElseIf и сразу же переходит к «концу, если».

У меня сильное чувство, что я упускаю здесь что-то очевидное...

For x = MinDate To MaxDate
    With salesr
        Set FindRng = .Find(What:=x, _
                            LookIn:=xlValues, _
                            Lookat:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            If Not FindRng Is Nothing Then
                RowNumber = FindRng.Row
                FindRng.Offset(, 2).Resize(1, 39).ClearContents
                For Each y In RegionsArray
                    With Regions
                        Set FindRng2 = .Find(What:=y, _
                                             LookIn:=xlValues, _
                                             Lookat:=xlWhole, _
                                             SearchOrder:=xlByColumns, _
                                             SearchDirection:=xlNext, _
                                             MatchCase:=False)
                             If Not FindRng2 Is Nothing Then
                                ColLeft = FindRng2.Column
                                ColRight = FindRng2.Column + 1
                                result = Application.WorksheetFunction.SumIfs(Import.Range("S:S"), Import.Range("M:M"), x, Import.Range("O:O"), y)
                                result1 = Application.WorksheetFunction.SumIfs(Import.Range("T:T"), Import.Range("M:M"), x, Import.Range("O:O"), y)
                                If result > 0 Then
                                    sales.Cells(RowNumber, ColLeft).Value = result
                                Else
                                End If
                                sales.Cells(RowNumber, ColRight + 1).Value = result1
                                If y = "BLF" Or y = "BAS" Then
                                    If y = "BLF" Then Region = "Belfast"
                                    ElseIf y = "BAS" Then Region = "Basingstoke"
                                    End If
                                    If y <> "BLF" And y <> "BAS" Then
                                    Region = y
                                End If
                             End If
                             sales.Cells(RowNumber, ColRight).Formula = "=SUMIFS(Table_PTQV02_PTQSOFT_SALES_ORDERS_Index3[Sales_day],Table_PTQV02_PTQSOFT_SALES_ORDERS_Index3[SALES_DATE],""" & x & """,Table_PTQV02_PTQSOFT_SALES_ORDERS_Index3[REGION_NAME],""*" & Region & "*"")"                
                    End With
                Next y
            Else
            End If
    End With                         
Next x

person Statsanalyst    schedule 26.10.2017    source источник
comment
Вы пытались установить точку останова и выполнить ее с помощью отладчика?   -  person Stefan    schedule 26.10.2017
comment
Да, конечно.   -  person Statsanalyst    schedule 26.10.2017
comment
Я думаю, что ваш ElseIf избыточен, в предыдущем утверждении If вы уже сократили возможности до "BLF" Or "BAS", так почему бы не использовать только Else?   -  person J. Pichardo    schedule 26.10.2017
comment
Итак, каково значение y, когда оно достигает ElseIf? Или, лучше, попадает ли он в оператор, когда ввод "BAS", а если нет, то почему? Может быть, в y есть пробел.   -  person Stefan    schedule 26.10.2017
comment
О, кажется, вам не хватает End If   -  person Stefan    schedule 26.10.2017
comment
@Stefan значение y равно BAS. Я также думал, что мне не хватает конца, если, но он продолжал давать мне конец, если без блока, если ошибка...   -  person Statsanalyst    schedule 26.10.2017
comment
В этом модуле есть Option Explicit вверху? Если нет, добавьте его и посмотрите, не появятся ли какие-либо синтаксические ошибки.   -  person Brian M Stafford    schedule 26.10.2017
comment
@BrianMStafford да, это так   -  person Statsanalyst    schedule 26.10.2017
comment
Если у вас есть оператор If в одной строке, он считается закрытым, т. е. f y = BLF Then Region = Belfast является закрытым и не требует End If, поэтому вы не можете использовать ElseIf после. Вы должны разделить строки согласно ответу Стаффорда   -  person QHarr    schedule 26.10.2017


Ответы (2)


Этот блок кода недействителен:

   If y = "BLF" Or y = "BAS" Then
       If y = "BLF" Then Region = "Belfast"
       ElseIf y = "BAS" Then Region = "Basingstoke"
       End If
       If y <> "BLF" And y <> "BAS" Then
       Region = y
   End If

Попробуйте структурировать это следующим образом:

   If y = "BLF" Or y = "BAS" Then
       If y = "BLF" Then
          Region = "Belfast"
       ElseIf y = "BAS" Then
          Region = "Basingstoke"
       End If
   ElseIf y <> "BLF" And y <> "BAS" Then
       Region = y
   End If

Или вы можете радикально упростить его следующим образом:

   Region = y
   If y = "BLF" Then Region = "Belfast"
   If y = "BAS" Then Region = "Basingstoke"
person Brian M Stafford    schedule 26.10.2017
comment
Это правильно - помечено как ответ. Я сказал, что это будет что-то очевидное! Я больше привык к SQL, где можно поставить потом на той же строке. - person Statsanalyst; 26.10.2017
comment
@Statsanalyst, вы абсолютно можете поместить Then xyz в ту же строку, за исключением случаев, когда вы пишете If выписку, и поэтому здесь нет блока, и, следовательно, нет End If нужен (и ставить его, по сути, незаконно). Когда вы ставите xyz в строке после Then, вы пишете If блок, а End If является обязательным. Вы не можете смешивать и сопоставлять синтаксисы — выберите один: оператор или блок. - person Mathieu Guindon; 26.10.2017
comment
FWIW, если есть только две ветки, значительно упрощенный код можно было бы дополнительно упростить до Region = IIf(y = "BLF", "Belfast", "Basingstoke"), но IMO словарь, отображающий 3-символьные ключи в полные имена, был бы намного чище. - person Mathieu Guindon; 26.10.2017
comment
@Mat'sMug неплохая идея, но есть несколько ответвлений. Я изменил названия реальных складов, чтобы защитить конфиденциальную информацию. Значение двух реальных складов состоит в том, что они единственные два, для которых трехзначные коды не содержатся в полном названии - например. BLF не находится в Белфасте, тогда как, например, EDI находится в Эдинбурге. Но когда я изменил имена, я по глупости выбрал BAS для Basingstoke и забыл, что это действительно содержит BAS! - person Statsanalyst; 27.10.2017
comment
@Statsanalyst посмотрит, как Scripting.Dictionary может помочь вам сопоставить значения здесь. В качестве альтернативы вы также можете использовать Collection с ключом, а затем сделать Region = regionMap(y). - person Mathieu Guindon; 27.10.2017

Держите условия простыми и напишите это, как показано ниже:

If y = "BLF" Or y = "BAS" Then
   If y = "BLF" Then
      Region = "Belfast"
   Else
      Region = "Basingstoke"
   End If
Else
    Region = y     
End If
person Md. Suman Kabir    schedule 26.10.2017