2012-12-30 3 views
0

이 코드를 실행하려고하면 "컴파일 오류 : 다음에 수행하지 않음"상태가 계속됩니다. 그러나 여러 번 모든 것을 확인한 후에 나는 그것이 어떻게 그들의 존재를 인식하지 못하는지 보지 않습니다. 이것은 첫 번째 VBA 코드이므로 도움을 주시면 대단히 감사하겠습니다.다음 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 선택 케이스 :) –

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 

으로 원래 작성된 코드의 문제에 관계없이 그렇지 조항의 컴파일러는 여전히 종료가 기대하는, 즉 모든 경우를위한 경우 그들이 거기에 없기 때문에 혼란스러워지고있다. 단일 키워드 ElseIf은 끝에 End If 문만 필요합니다.

고토의 경우가 거의 없습니다. 시간의 99 %는 Goto를 사용하지 않고 더 좋고 깨끗한 방법으로 작성합니다.

+0

이렇게하면 모든 조건이 항상 평가됩니다. 'ElseIf'는 조건이 만족되는대로 평가를 중단합니다. – GSerg

+0

@GSerg : 고정 ... –

0

다른 답변 VBA이 ForNext 쌍의 위로를 인식하도록 당신이 당신의 If 문을 해결할 수있는 방법을 나타냅니다.

이제 개인적으로 루프가 필요한 경우 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 

그것은 일반적으로 VBA에서 논리를 작성하고 셀을 루핑하는 대신 Excel 공식을 사용하여 이러한 문제를 해결하는 빠르고 더 깨끗합니다.

관련 문제