接下来没有For VBA

时间:2012-12-30 19:24:49

标签: excel-vba for-loop compiler-errors next vba

当我尝试运行此代码时,我不断收到“编译错误:下一个没有For”。但是,在多次检查所有内容后,我看不出它是如何识别它们的存在的。这是我的第一个VBA代码,所以任何帮助将不胜感激。

Sub Naming()
'
' Naming Macro
' Assigns a category name in a cell based on values in a cell one column over 
'

Dim number As Double

For i = 9 To 200
    number = Cells(i, 3).Value
        If number = 0 Then
            GoTo Line1
        Else
            If number <= 199999 And number > 0 Then
            Cells(i, 2) = "EP-GEARING"
        Else    
            If number <= 399999 And number > 199999 Then
            Cells(i, 2) = "DRIVES"
        Else
            If number <= 499999 And number > 399999 Then
            Cells(i, 2) = "FLOW"
        Else
            If number <= 599999 And number > 499999 Then
            Cells(i, 2) = "SPARES"
        Else
            If number <= 699999 And number > 599999 Then
            Cells(i, 2) = "REPAIR"
        Else
            If number <= 799999 And number > 699999 Then
            Cells(i, 2) = "FS"
        Else
            If number <= 899999 Then
            Cells(i, 2) = "GC-GEARING"
        Else
            GoTo Line1
Line1:
        End If
Next i

End Sub

3 个答案:

答案 0 :(得分:5)

ElseIf是VB中的一个词。

If number = 0 Then
    'Do nothing
ElseIf number <= 199999 And number > 0 Then
    Cells(i, 2) = "EP-GEARING"
ElseIf number <= 399999 And number > 199999 Then
    ...
Else
    'Do nothing
End If

但是,Select Case更适合这里:

Select Case number
    Case 0
        'Do nothing
    Case 1 To 199999
        Cells(i, 2) = "EP-GEARING"
    Case 200000 To 399999
        ...
    Case Else
        'Do nothing
End Select

答案 1 :(得分:1)

您的代码应如下所示:

Sub Naming()
'
' Naming Macro
' Assigns a category name in a cell based on values in a cell one column over 
'

Dim number As Double

For i = 9 To 200
    number = Cells(i, 3).Value

    If number <= 199999 And number > 0 Then
        Cells(i, 2) = "EP-GEARING"
    ElseIf number <= 399999 And number > 199999 Then
        Cells(i, 2) = "DRIVES"
    ElseIf number <= 499999 And number > 399999 Then
        Cells(i, 2) = "FLOW"
    ElseIf number <= 599999 And number > 499999 Then
        Cells(i, 2) = "SPARES"
    ElseIf number <= 699999 And number > 599999 Then
        Cells(i, 2) = "REPAIR"
    ElseIf number <= 799999 And number > 699999 Then
        Cells(i, 2) = "FS"
    ElseIf number <= 899999 Then
        Cells(i, 2) = "GC-GEARING"
    End If

Next i

End Sub

最初编写代码的问题在于,无论Else子句如何,编译器仍然期望每个If都有一个End If,并且因为它们不存在而感到困惑。单个关键字ElseIf最后只需要一个End If语句。

Goto很少是可取的。 99%的时间,没有使用Goto,有更好,更清晰的方式来编写它。

答案 2 :(得分:0)

其他答案表明您如何修复If声明,以便VBA识别您的ForNext配对。

现在,就个人而言,如果您的循环是必要的话,我建议使用Select Case作为GSerg指示。

但这可能就是我要做的。在单元格B9中放置以下公式:=IF(C9=0,"",IF(C9<=199999,"EP-GEARING",IF(C9<=399999,"DRIVES",IF(C9<=499999,"FLOW",IF(C9<=599999,"SPARES",IF(C9<=699999,"REPAIR",IF(C9<=799999,"FS",IF(C9<=899999,"GC-GEARING",""))))))))然后将其复制到您需要的位置。

或者如果你想用代码来做它你可以用没有循环来替换你的整个sub我可以把它写成1个衬垫,但我希望它清晰可见:

Sub Naming()
'
' Naming Macro
' Assigns a category name in a cell based on values in a cell one column over
Dim theRange As Range
Set theRange = Range(Cells(9, 2), Cells(200, 2))
theRange.Value = "=IF(RC[1]=0,""""," & _
                "IF(RC[1]<=199999,""EP-GEARING""," & _
                "IF(RC[1]<=399999,""DRIVES""," & _
                "IF(RC[1]<=499999,""FLOW""," & _
                "IF(RC[1]<=599999,""SPARES""," & _
                "IF(RC[1]<=699999,""REPAIR""," & _
                "IF(RC[1]<=799999,""FS""," & _
                "IF(RC[1]<=899999,""GC-GEARING"",""""))))))))"
'Optional if you want only the values without the formula, uncomment next line
'theRange.Value = theRange.Value

Set theRange = Nothing

End Sub

使用Excel公式解决这样的事情通常更快更清洁,而不是在VBA中写出逻辑并循环遍历单元格。