2012-12-30 55 views
0

当我尝试运行这段代码时,我总是收到一个“编译错误:next for For”。但是,在多次检查完所有内容之后,我看不出它是如何识别它们的存在的。这是我的第一个VBA代码,所以任何帮助将不胜感激。Next for 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 

回答

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

不要使用转到。这是没有必要的。 –

+0

@RobertHarvey固定... – GSerg

+0

+ 1 For Select Case :) –

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子句中,编译器仍预计的结束如果每一个如果,和因为他们不在那里而感到困惑。单个关键字ElseIf最后只需要一个End If语句。

Goto's很少建议。 99%的时间,有一个更好,更干净的方式来写它,而不使用转到。

+0

这样,所有的条件将永远被评估。一旦条件满足,ElseIf将停止评估。 – GSerg

+0

@GSerg:固定... –

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",""))))))))然后将其复制到您需要的位置。

或者,如果你想与代码,你可以不循环,我可以写这为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中的逻辑和循环遍历单元格。