Rubberduck VBA: что может вызвать ошибку распознавателя?

Благодаря этому вопросу: подменю пользовательского интерфейса Rubberduck отключены, я знаю, что Возможно, мне придется нажать кнопку «Обновить», чтобы использовать RubberduckVBA.

Одной из ошибок, которая может последовать, является, по-видимому, «Ошибка разрешения».

введите здесь описание изображения

В каких случаях может возникнуть такая ошибка распознавателя?


person Akita    schedule 29.08.2018    source источник
comment
Это может помочь .   -  person John Coleman    schedule 29.08.2018
comment
@JohnColeman документация по этому вопросу довольно тонкая. ОП: какую версию ты используешь? За последнее время парсер/преобразователь претерпел очень значительные изменения. Вы можете скопировать информацию о версии в буфер обмена, щелкнув поле версии в диалоговом окне «О программе».   -  person Mathieu Guindon    schedule 29.08.2018
comment
@MathieuGuindon Я заметил, что поэтому изменил свой комментарий.   -  person John Coleman    schedule 29.08.2018
comment
@MathieuGuindon Моя версия была 2.2.0.3439-pre. Сейчас я установил 2.2.0.3723-pre, но все равно получаю ту же ошибку. Версия 2.2.0.3723 ОС: Microsoft Windows NT 10.0.16299.0, x64 Хост-продукт: Microsoft Office 2016 x64 Хост-версия: 16.0.8730.2175 Хост-исполняемый файл: EXCEL.EXE   -  person Akita    schedule 30.08.2018
comment
Спасибо, что сообщили об этом! У нас есть сотни пройденных автоматических тестов парсера и распознавателя, но трудно охватить все =)   -  person Mathieu Guindon    schedule 30.08.2018


Ответы (2)


TL;DR: Rubberduck просрочен для нового «официального» релиза!

Отказ от ответственности: я управляю проектом Rubberduck OSS и участвую в нем.

Исключение возникло при обходе деревьев синтаксического анализа. Трудно точно сказать, что произошло, потому что синтаксический анализ и разрешение кода VBA — это очень сложный, многоэтапный процесс.

Чтобы узнать, что именно пошло не так, нужно посмотреть логи — логирование по умолчанию отключено (оно достаточно подробное), нужно включить его через диалог настройки:

Диалоговое окно настроек Rubberduck

Установите для минимального уровня журнала значение Трассировка для получения полной информации обо всем, что делает синтаксический анализатор/преобразователь, или Ошибка для менее подробного журнала, который включает только информацию об исключении; затем вы можете опубликовать этот журнал (или его части) в новой задаче, и разработчики проекта незамедлительно пометят/пометят его соответствующим образом, изучат детали журнала/исключения и определят, была ли проблема исправлена ​​в более поздней предварительной сборке или это новая ошибка, которую необходимо исправить.

Поскольку почти каждая отдельная функция требует точного понимания кода в VBE, разработчики Rubberduck очень серьезно относятся к проблемам парсера/преобразователя.

Если вы используете последнюю «зеленую» версию (v2.2.0), я уверен, что с тех пор проблема была исправлена. В последней "предварительной" сборке есть досадные проблемы с функцией автодополнения (определенно будет исправлено в версии 2.3.0), но теперь резолвер работает очень хорошо :)

person Mathieu Guindon    schedule 29.08.2018
comment
Хорошо, я собираюсь открыть тему. - person Akita; 30.08.2018

По крайней мере, один из случаев выглядит следующим образом:

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

Решение:

Этот "мусорный" код можно обнаружить в журналах уровня трассировки Rubberduck.

Например, в моем случае:

Sub CleanSheetOut()
Worksheets(sheetOut).Range("A1:XFD10485576").Clear
Worksheets(sheetOut).Range("A1:XFD10485576").Interior
        .Pattern = xlNone
       .TintAndShade = 0
     .PatternTintAndShade = 0
End Sub

... был неправильным (не компилировался), но никогда не вызывался, поэтому проект работал нормально, но Rubberduck не мог решить.

Правильный код:

Sub CleanSheetOut()
   Worksheets(sheetOut).Range("A1:XFD10485576").Clear
   With Worksheets(sheetOut).Range("A1:XFD10485576").Interior
      .Pattern = xlNone
      .TintAndShade = 0
      .PatternTintAndShade = 0
   End With
End Sub

... компилирует и позволяет Rubberduck нормально анализировать и разрешать.

Журналы: введите здесь описание изображения ... показал неисправный саб и в каком модуле я смог его найти.

Комментарий от команды разработчиков Rubberduck:

Компилируется ли VBE на лету, зависит от настроек компиляции в правом нижнем углу вкладки «Редактор» в меню «Инструменты» -> «Параметры».

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

Подробнее см. в этой ветке Github.

person Akita    schedule 31.08.2018
comment
Вы уверены, что это не было замечено? Когда вы нажали на x, указывающий на ошибку компиляции, куда она вас привела? - person QHarr; 31.08.2018
comment
Когда я говорю не замечено, я имею в виду не замечено мной при запуске основной части проекта. Я не имею в виду, что его не заметил Резиновый утенок. - person Akita; 31.08.2018
comment
Ржунимагу. Извиняюсь! Виноват. - person QHarr; 31.08.2018
comment
Я не был слишком откровенен. Я обновил свой ответ, чтобы сделать его более понятным. - person Akita; 31.08.2018
comment
Для протокола (и любопытного): MemberAccessDefaultBinding означает, что Rubberduck пытался разрешить то, что он проанализировал как доступ к члену, но не смог понять, на какой объект ссылался доступ к члену (из-за отсутствующего блока With) - также вы может вручную скомпилировать ваш проект VBA в любое время из меню «Отладка»; тогда VBE выделил бы первый неквалифицированный доступ к члену, вызвавший ошибку компиляции. Рад, что это не ошибка резолвера! - person Mathieu Guindon; 31.08.2018