Переменные VBA предоставляют случайные ошибки с постоянным выражением

Я использую перечисление, определенное в модуле класса в Excel VBA. Это работает нормально, но я начал получать ошибку компиляции каждый раз, когда я сравниваю переменные enum:

В классе CExample:

Enum MyEnum
    Foo
    Bar
End Enum

В другом месте:

If someValue = myEnum.Foo Then

Текст .Foo будет выделен и появится сообщение "Ошибка компиляции: постоянное выражение".

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

Это действительно известная ошибка в VBA? Есть ли что-нибудь, что я могу сделать, чтобы избежать этого, или надежно заставить VBA работать снова, если это произойдет?

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

Обновление после перезагрузки:

Проблема продолжалась после перезагрузки моей машины, что удивительно. Я попробовал добавить Public перед определением enum (они должны быть public по умолчанию, но я думал, что дам попробуйте), и ошибка исчезла. Я удалил ключевое слово Public (так что мы вернулись к исходному коду), и он все еще компилируется и работает нормально.

Это похоже на случайную ошибку в VBA. Мне было бы интересно узнать, нашли ли опытные разработчики это часто - не советовали ли вы использовать перечисления? Или он появляется один раз в голубой луне, и мне просто не повезло?

Обновление после 6 недель дальнейшей разработки:

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

Ответ 1

Как отмечено в вопросе, я избавился от ошибки, отредактировав и сохранив определение перечисления, а затем снова отменил редактирование и сохранение. Недавно проделав еще какую-то работу над проектом, я нашел другую, но схожую проблему - одна строка кода привела к ошибке "Ошибка несоответствия типа", где не было рассогласования типов и где одна и та же функция, неизменная, отлично работала с те же самые входы.

Некоторые из прерывистых ошибок, которые я вижу, могут быть связаны с накоплением артефактов кода в файле Excel - сделав некоторое чтение, я обнаружил, что код VBA компилируется и сохраняется в файле. Там нет "чистого" или "перестроить все" - VBA пытается самостоятельно разработать, какие дополнительные изменения необходимы. Это может привести ко всем видам нечетного поведения во время работы в проектах, в которых вы сделали много изменений кода. Вероятно, это является причиной ошибок перечисления, которые я обнаружил во время первоначальной разработки этой книги. Раздел " Что он хочет декомпилировать и скомпилировать в VBA" в этой статье дается хороший обзор.

В большинстве упоминаний этой проблемы рекомендуется использовать VBA CodeCleaner: http://www.appspro.com/Utilities/CodeCleaner.htm. Чип Пирсон, известный и уважаемый эксперт VBA, говорит: "Я очень рекомендую эту надстройку". Я удивлен, что раньше этого не встречал!

Ответ 2

Кажется, это ошибка.

Скопируйте тот же код модуля на новый и перекомпилируйте. Кажется, это решение для некоторых.

Аналогичное исправление существует, которое включает в себя редактирование и уничтожение строки определения перечисления.

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

Ответ 3

Старый вопрос, но просто испытал это. Удалено общедоступное определение в Enum, и оно составлено просто отлично. Не перезапустил IDE. Удивительно, что это все еще здесь.

Ответ 4

Эта ошибка возникает время от времени, когда не было внесено никаких изменений в перечисление или его использование или какой-либо связанный код. То, что мне помогло, - это перевести перечисление из класса в модуль, который я назвал "общим", и сделать перечисление общедоступным, а не частным.