kusold
kusold

Reputation: 506

Next without For VBA

I keep getting a "compile error: next without For" when I try to run this code. However, after checking everything over multiple times, I do not see how it does not recognize their presences. This is my first VBA code, so any help would be greatly appreciated.

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

Upvotes: 0

Views: 6732

Answers (3)

Daniel
Daniel

Reputation: 13122

The other answers indicate how you could fix your If statement so that VBA recognizes your For and Next pair up.

Now, personally, I would suggest using Select Case as GSerg indicated, if your loop were necessary.

But here is probably what I would do. In Cell B9 place the following formula: =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","")))))))) then copy it down where you need it.

Or if you want to do it with code you could replace your whole sub with no looping I could have written this as a 1 liner, but I wanted it to be legible:

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

It is generally faster and cleaner to solve things like this using Excel formulas rather than writing out the logic in VBA and looping through cells.

Upvotes: 0

Robert Harvey
Robert Harvey

Reputation: 180808

Your code should look like this:

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

The problem with your code as originally written is that, regardless of the Else clauses, the compiler still expects an End If for every If, and is getting confused because they are not there. The single keyword ElseIf only requires one End If statement at the end.

Goto's are seldom advisable. 99 percent of the time, there's a better and cleaner way to write it, without using a Goto.

Upvotes: 1

GSerg
GSerg

Reputation: 78185

ElseIf is one word in 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

However, Select Case would fit better here:

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

Upvotes: 5

Related Questions