2017-10-26 25 views
0

次のコードではコードは機能しますが、 "else if"行はスキップされます。ElseIf y = "BAS" then "Basingstoke""ElseIf"をスキップするVBA - elseifステートメント

Basingstokeは、Yが来る配列のベルファストに従うので、 "Region"値として "Belfast"を保持します。それは正常に動作しますが、単にElseIf行をスキップし、直後の "end if"に行きます。

私はこのコードブロックは無効である

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 
+0

あなたはブレークポイントを設定し、デバッガでそれをステップ実行しようとしたことがありますか? – Stefan

+0

はい、もちろんです。 – Statsanalyst

+0

私はあなたの 'ElseIf'が重複していると思います。前の' If'ステートメントでは、あなたはすでに '' BLF ''や '' BAS''への可能性を減らしました。 –

答えて

4

...私はここに何かを明らかに欠けている、強い気持ちを持っている:

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" 
+0

ごとに行間を分割する必要があります。これは正しいです - 答えとしてマークされています。 私はそれが何か明白であると言いました! 私はSQLに慣れています。ここでは、 "then"を同じ行に置くことができます。 – Statsanalyst

+0

@Statsanalystあなたは絶対に 'Then xyz'を同じ行に置くことができます - あなたが' If' *文*を書いているときを除いて、*ブロック*は含まれていないので、 'End If'はありません必要とする(実際には違法である)。 '' Then'の後ろに 'xyz'を置くと、' If' *ブロック*を書くことになり、 'End If'は*必須*です。構文を混在させたり、一致させることはできません。一つを選んで:ステートメントまたはブロックします。 –

+0

FWIWブランチが2つしかない場合、大幅に単純化された*コードは 'Region = IIf(y =" BLF "、" Belfast "、" Basingstoke ")'にさらに簡略化されますが、IMOは3文字のキーフルネームにはもっときれいになるでしょう。 –

0

は、単純な条件を維持し、以下のように書く:

If y = "BLF" Or y = "BAS" Then 
    If y = "BLF" Then 
     Region = "Belfast" 
    Else 
     Region = "Basingstoke" 
    End If 
Else 
    Region = y  
End If 
関連する問題