#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: вы должны удалить
:
afterElse
.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. Почему бы вам не скопировать и не вставить фактический проблемный код в свой вопрос. Это решило бы множество проблем для людей, пытающихся ответить.