2010-05-11 5 views
1

Как достичь следующего?VBA: выпрыгивание из цикла for

Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
    Worksheets("Drop-down").Select 
    n = Cells(1, 1).End(xlDown).Row 
    For i = 1 To n 
     ActiveSheet.Cells(i, 2).Select 
     ******************************************************* 
     If Worksheets("Misc").Cells(2, i).Value = "" Then 
      continue i 
     End If 
     ******************************************************* 
     If Worksheets("Misc").Cells(3, i).Value <> "" Then 
      Set validationRange = Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)) 
     Else 
      Set validationRange = Worksheets("Misc").Cells(2, i) 
     End If 
     With Selection.Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
      xlBetween, Formula1:=validationRange.Address 
      .IgnoreBlank = True 
      .InCellDropdown = True 
      .InputTitle = "" 
      .ErrorTitle = "" 
      .InputMessage = "" 
      .ErrorMessage = "" 
      .ShowInput = True 
      .ShowError = True 
     End With 
    Next i 
End Sub 

ответ

4

Разве это не простое управление потоком дело? Я не понимаю, о необходимости специальных ключевых слов, чтобы решить эту проблему:

For i = 0 To 10 
If Not condition Then 
    some other code 
Next 

EDIT: Или в вашем коде:

Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
    Worksheets("Drop-down").Select 
    n = Cells(1, 1).End(xlDown).Row 
    For i = 1 To n 
     ActiveSheet.Cells(i, 2).Select 
     ******************************************************* 
     If Not Worksheets("Misc").Cells(2, i).Value = "" Then 
     ******************************************************* 
      If Worksheets("Misc").Cells(3, i).Value <> "" Then 
       Set validationRange = Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)) 
      Else 
       Set validationRange = Worksheets("Misc").Cells(2, i) 
      End If 
      With Selection.Validation 
       .Delete 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
       xlBetween, Formula1:=validationRange.Address 
       .IgnoreBlank = True 
       .InCellDropdown = True 
       .InputTitle = "" 
       .ErrorTitle = "" 
       .InputMessage = "" 
       .ErrorMessage = "" 
       .ShowInput = True 
       .ShowError = True 
      End With 
    ******** 
     End If 
    ******** 
    Next 
End Sub 
+0

Спасибо. Глупый я. Думаю, я не могу правильно правильно закодировать ... – stanigator

+0

Не беспокойтесь, рад, что я мог бы помочь. –

+0

Это действительно лучший способ сделать это. несколько заметок, в VBA нет «Next i», это просто следующее – TerrorAustralis

0

Не указаны ли ключевые слова vb?

For n = 1 To something 
    If condition Then 
     Continue For 
    End If 

    ' more code 

Next n 

Ключевое слово Continue делает то, что вы хотите.

http://msdn.microsoft.com/en-us/library/801hyx6f(VS.80).aspx

+0

Я думаю, что ключевые слова автоматически извлечь выгоду, когда вы находитесь в IDE , но если вы просто пишете файл VBScript, он игнорирует этот случай. – Tom

+0

Окно VBA IDE не распознает ваши предложения. – stanigator

+0

Каким образом? Какая часть? – Eric

2

И чтобы ответить на вторую половину вопроса:

For n = 1 To something 
    If condition Then 
     Exit For 
    End If 
    ' more code 

Next n 
+0

Это не делает то, что я хочу, поскольку он полностью завершает цикл for. – stanigator

+1

Ваш вопрос спросил, как прыгать «из цикла for». Из вашего кода то, что вам казалось нужным, было на самом деле выражением «Продолжить для», как ответил @Eric, я добавлял «Exit For» для полноты. Как сказал еще один ответчик, использование инструкции Else тоже хорошо. Есть много способов кожи кошки. – Tom

Смежные вопросы