Как программно найти/отладить (найти местоположение) отсутствующего `End If`

У меня есть длинный код в событии рабочего листа, который содержит множество условий IF и вложенных IF.
Иногда я забываю добавить конец if, поэтому, когда я отлаживаю код, получаю это Compile error:Block If without End If.
Значение ошибки очень ясно, и я полагаюсь на свой глаз, чтобы найти этот недостающий ЕСЛИ.
Поскольку код в событии листа, я не могу использовать F8 (шаг внутрь).
Так, Есть ли программный способ найти/отладить (Найти местоположение) недостающие End If.
Заранее благодарен за любые полезные комментарии и ответы.

Эта ошибка может быть вызвана разными причинами, а не только отсутствием End If. например оператор With без End With внутри блока If также вызовет эту ошибку. Сделайте правильный отступ в своих кодах, и вам будет легче обнаружить ошибку. Обновите свой вопрос с помощью кода, и, возможно, кто-нибудь его заметит? Вы также можете скопировать/вставить код в обычный модуль, чтобы протестировать его.

Raymond Wu 17.03.2022 09:01

Используйте отступы для предложений if - тогда довольно легко не пропустить оператор end-if. Также: может быть полезно разделить код, чтобы избежать большого количества отступов.

Ike 17.03.2022 09:02
Резиновая уточка VBA — это бесплатная надстройка с индексатором кода. Code Indenter поможет найти несоответствующие операторы.
TinMan 17.03.2022 09:19

Просмотр Мастер отладки VBA за 20 минут сэкономит вам много времени.

TinMan 17.03.2022 09:21

Учтите, что компилятору VBA не понадобился бы ENDIF, если бы он мог определить, где он должен заканчиваться. Вы можете разместить ENDIF в разных местах, чтобы добиться другого потока выполнения программы. Лучше всего красиво отформатировать весь ваш код, отступив блоки, как предложил @RaymondWu, выявляя аномалии.

tinazmu 17.03.2022 09:42
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
5
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просмотрите свой код и убедитесь, что у вас нет однострочных операторов 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. Во вложенных блоках внутренние блоки всегда должны быть закрыты первыми.

Очень полезный ответ ?

Waleed 17.03.2022 13:21

Пожалуйста, не могли бы вы помочь stackoverflow.com/questions/71748357/…

Waleed 05.04.2022 10:32

Другие вопросы по теме