Во вложенном Excel VBA для…Следующий цикл, родительский Next не может найти его для

#vba

#vba

Вопрос:

 For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" 'testing for an error
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
EndLoop:
Next j '<<<PROBLEM
  

Компилятор жалуется, что Next j (строка 9) является «Следующим без For».

Комментарии:

1. Редактор VBA не делает отступ автоматически. В противном случае вы увидите свою строку «Next j» на том же уровне, что и «Next i», следовательно, сообщая вам, что проблема связана с отсутствующим «End if», как сказал @PowerUser в своем ответе.

2. В этом коде содержится как минимум четыре синтаксические ошибки. На этом этапе, вероятно, было бы полезно прочитать файл справки VBA для каждого и всех ключевых слов, которые вы используете.

Ответ №1:

Проблема в вашем операторе IF. Вам нужно добавить как Then, так и End, если:

 For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" **Then**
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
    **End If**
EndLoop:
Next j '<<<PROBLEM
  

Редактировать
В вашем имени типа также отсутствует закрывающая скобка.

Комментарии:

1. 1 Я считаю, что goto можно было бы избежать с минимальными усилиями со стороны @MonteCarloGenerator

2. На самом деле, вы могли бы заменить goto на nothing и получить тот же эффект!

3. @PowerUser: вы должны удалить : after Else .

4. В коде гораздо больше ошибок, чем просто Then и End If 🙂

Ответ №2:

 For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0)) <> "String" Then
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
    End If
Next j
  

Как указал Рему, вам следует избавиться от Goto и протестировать то, что вы хотите протестировать, а именно, что это не строка.

Обычно у вас никогда не должно быть двоеточия после else, если в этой строке нет другого исполняемого фрагмента кода. И даже тогда…

Ответ №3:

В вашем коде и логике есть несколько ошибок.

 For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" 'testing for an error
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
EndLoop:
Next j '<<<PROBLEM
  

Основная проблема заключается в логике — если вам важно только то, что имя типа не является строкой, проверьте это. Нет необходимости добавлять оператор else, не говоря уже о GoTo . Как часто говорят:

Оператор GoTo часто может указывать на возможность исправить логику в вашем коде

Одна вещь, которая помогает, — это сосредоточиться на том, что вы хотите сделать, а не на том, что вы не хотите делать. Хорошей практикой является запись ожидаемого / желаемого пути, а затем добавление дополнительных случаев после (при необходимости).

Другие области, которые нужно исправить:

  • В строке 2 вам не хватает )
  • В строке 2 удалите комментарий. Код является / должен быть понятным.
  • Вы должны поменять местами i и j. Кто-то, читающий код, предположит, что i идет первым.
  • В строке 4 вы должны удалить «:»

Вот очищенный код:

 For i = 0 To SpreadCount
    If TypeName(ChainsDC(i, 0)) <> "String" Then
        For j = 0 To RscSct
            '...do amazing things here
        Next
    End If
Next
  

Ответ №4:

Else: Возможно, это проблема, а также отсутствие End If .

Комментарии:

1. В чем проблема, которую вы видите с этим?

2. Это метка, а не an Else .

3. Извините, это была опечатка, когда я копировал в StackOverflow

4. Почему бы вам не скопировать и не вставить фактический проблемный код в свой вопрос. Это решило бы множество проблем для людей, пытающихся ответить.