Почему я могу добавить, но не удалить оператор Dim в режиме отладки?

Немного тривиальный вопрос, но он меня заинтересовал.

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

В режиме отладки нельзя ни удалить, ни изменить операторы Dim без противодействия предупреждающему сообщению:

Это действие приведет к сбросу вашего проекта. Все равно продолжить?

Я предполагаю, что это связано с тем, что компилятор сохранил переменные в памяти способом, характерным для их типов данных, что, по-видимому, не может быть изменено во время «выполнения» кода.

Однако я заметил, что добавление объявления в режиме приостановки может быть выполнено без каких-либо проблем. Попытка удалить или отредактировать эту строку снова выдает предупреждающее сообщение.

Почему можно добавлять, но нельзя удалять/редактировать объявления в режиме перерыва?


person Tim Stack    schedule 29.04.2019    source источник
comment
Это происходит, когда вы пытаетесь удалить разрывы строк _ или with происходит во многих случаях, иногда даже при попытке удалить пустую строку...   -  person Damian    schedule 29.04.2019
comment
Я в курсе, но это не совсем относится к моему вопросу   -  person Tim Stack    schedule 29.04.2019


Ответы (2)


Я твердо предполагаю, что среда выполнения VBA не позволяет вам изменять существующие записи в таблице символов. Предположим, вы сделали что-то вроде

Dim i as Integer
i = 3
Debug.print i

Вы устанавливаете точку останова на оператор Print и меняете тип i на String — что среда выполнения должна делать с содержимым i? Неявно преобразовать его в строку? И что должно произойти, если конвертация невозможна?

Добавление новой записи в таблицу символов не приносит никакого вреда, потому что оно не изменяет ничего из того, что было сделано ранее, поэтому среда выполнения позволяет вам это сделать.

Кстати: если вы удалите Option Explicit (я знаю, что мы с вами никогда этого не делаем...) и присвоите значение (необъявленной) переменной: эта переменная теперь помещается в таблицу символов, и если вы попытаетесь добавить Dim-оператор сейчас , вы получите сообщение This action will reset....

person FunThomas    schedule 29.04.2019
comment
Даже если я сломаюсь до того, как заполню переменную i, проект будет сброшен, если я попытаюсь удалить или изменить объявление. В таком случае содержимое отсутствует, и, следовательно, между типом переменной и истинным типом содержимого не может произойти сбоев. - person Tim Stack; 29.04.2019
comment
На самом деле i имеет значение (0). Я думаю, дело в том, что в таблице символов есть запись (имя/тип/значение), и в этот момент среда выполнения не позволяет вам изменить ее. - person FunThomas; 29.04.2019
comment
Имеет смысл. Приветствую мысли по этому поводу - person Tim Stack; 29.04.2019
comment
См. также @MathieuGuindon, в котором говорится Инструкции Dim и Const не являются исполняемыми, это декларативные инструкции — вы не можете поставить на них точку останова: когда компилятор видит объявление Const при обработке кода VBA , он оценивает выражение значения в статическом контексте во время ►*компиляции* и записывает значение во все сайты вызовов. - person T.M.; 13.04.2021

Похоже, что если вы откроете рабочую книгу, которая объявляет хотя бы одну публичную функцию в своем проекте с включенной опцией VBE «Уведомлять перед потерей состояния», VBE предложит вам это действие сбросит ваш проект, все равно продолжить? сообщение, как только вы попытаетесь изменить строку объявления этой функции. Вероятно, потому что Excel каким-то образом загружает переменную, которая будет содержать возвращаемое значение...

person hymced    schedule 13.04.2021