У меня есть длинный код в событии рабочего листа, который содержит множество условий IF и вложенных IF.
Иногда я забываю добавить конец if, поэтому, когда я отлаживаю код, получаю это Compile error:Block If without End If
.
Значение ошибки очень ясно, и я полагаюсь на свой глаз, чтобы найти этот недостающий ЕСЛИ.
Поскольку код в событии листа, я не могу использовать F8 (шаг внутрь).
Так, Есть ли программный способ найти/отладить (Найти местоположение) недостающие End If
.
Заранее благодарен за любые полезные комментарии и ответы.
Используйте отступы для предложений if - тогда довольно легко не пропустить оператор end-if. Также: может быть полезно разделить код, чтобы избежать большого количества отступов.
Просмотр Мастер отладки VBA за 20 минут сэкономит вам много времени.
Учтите, что компилятору VBA не понадобился бы ENDIF, если бы он мог определить, где он должен заканчиваться. Вы можете разместить ENDIF в разных местах, чтобы добиться другого потока выполнения программы. Лучше всего красиво отформатировать весь ваш код, отступив блоки, как предложил @RaymondWu, выявляя аномалии.
Просмотрите свой код и убедитесь, что у вас нет однострочных операторов If (condition) Then (do something)
. Означает, что после каждого Then
следует разрыв строки и в этой строке не следует никакого оператора. Утверждения следуют в следующей строке ниже и закрываются знаком End If
.
If a Then b = 1 ' single line statement
избегайте их и всегда используйте такие блоки, как
If a Then
b = 1
End If
Это выглядит немного громоздко, но значительно упрощает поиск проблем.
Затем просмотрите свой код, убедитесь, что вы все сделали правильно. Так вы узнаете, есть ли незакрытые блоки.
Обратите внимание, что сообщение об ошибке может вводить в заблуждение и не связано с отсутствующим End If
. Даже ваш компилятор говорит вам об этом, это просто означает, что компилятор ждал End If
там, где пришло что-то еще, поэтому он просто не смог найти его в ожидаемой позиции:
Например, если вы просто перепутали позиции End If
и End With
и у вас неправильное форматирование кода, как показано ниже, вы получите отсутствующее сообщение компилятора End If
:
If Condition = True Then
With ActiveSheet
End If
End With
Но если вы правильно сделаете отступ в своем коде и красиво отформатируете его, вы легко увидите, что что-то не так:
If Condition = True Then
With ActiveSheet
End If ' should be `End With` inner block needs to close first
End With
Теперь вы ясно видите, что End If
и End With
перепутались и не совпадают со своими If
и With
. Во вложенных блоках внутренние блоки всегда должны быть закрыты первыми.
Очень полезный ответ ?
Пожалуйста, не могли бы вы помочь stackoverflow.com/questions/71748357/…
Эта ошибка может быть вызвана разными причинами, а не только отсутствием
End If
. например операторWith
безEnd With
внутри блокаIf
также вызовет эту ошибку. Сделайте правильный отступ в своих кодах, и вам будет легче обнаружить ошибку. Обновите свой вопрос с помощью кода, и, возможно, кто-нибудь его заметит? Вы также можете скопировать/вставить код в обычный модуль, чтобы протестировать его.