Во вложенном Excel VBA For ... цикл Next, родительский элемент Next не может найти свой For - PullRequest
0 голосов
/ 05 октября 2011
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) - это "Next без For".

Ответы [ 4 ]

5 голосов
/ 05 октября 2011

Ваше заявление ЕСЛИ является проблемой. Вам нужно добавить и Тогда и Конец, если :

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

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

3 голосов
/ 06 октября 2011

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

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

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

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

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

Другие исправляемые области:

  • В строке 2 вы пропускаете)
  • В строке 2 уберите комментарий.Код не должен / должен быть понятен.
  • Вы должны поменять местами i и j.Кто-то, читающий код, предположит, что я пришел первым.
  • В строке 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
3 голосов
/ 05 октября 2011
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 и проверить то, что вы хотите проверить, а именно, что это не строка.

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

2 голосов
/ 05 октября 2011

Ваш Else: может быть проблемой, а также пропавших без вести End If.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...