Ошибка выполнения3011, но не в режиме отладки - PullRequest
0 голосов
/ 11 октября 2019

У меня есть проект, над которым я работаю. У меня есть строка кода формы экспорта для экспорта определенной формы в другую только что созданную базу данных. Это одна из четырех экспортируемых вещей: 2 таблицы, 1 форма и 1 макрос Autoexec в указанном порядке. Первые два завершаются без проблем, либо во время выполнения, либо в режиме отладки. Тем не менее, форма, где проблема возникает. В режиме отладки он экспортируется без проблем, во время выполнения он создает объект ошибки 3011. Не найден.

Я думал, что это проблема синхронизации, потому что перед экспортом я меняю источник записи формы на одну из таблиц. Я экспортирую, и это завершается без проблем в обоих режимах, поэтому я переместил код, чтобы изменить форму, в начало моей процедуры с экспортом почти в самом конце. Я изменил последовательность кода, чтобы поместить около 2000 строк кода между редактированием формы и командой экспорта, и проблема все еще остается, работает в режиме отладки, а не во время выполнения. С тех пор я переместил код обратно в исходное местоположение. Это не проблема времени из-за близости.

Вот соответствующий код: Все переменные являются строками. CACID - это 11-значная строка, содержащая буквенно-цифровой код для карты CAC.

'''VBA
str_TestName - CACID & "_Test" 'Assigns a string variable to for the table created earlier-no issues
DoCmd.openForm "frm_Test", acDesign,,,, acHidden  'Opens the form hidden to modify design
Forms!frm_Test.RecordSource = str_TestName 'Sets the record source to the table created above
DoCmd.close acform, "frm_Test", acSaveYes  'Closes and saves the form edited-no issues
... SQL code to create table str_TblName, then SQL code to insert a record  'works
docmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, str_TableName, strTableName  'works
DoCmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, str_tblName, str_Tblname  'works
DoCmd.transferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, "frm_Test", frm_test"   'works in Debug not runtime
DoCmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acMacro, "Autoexec_Local", "Autoexec"

В совокупности эта система работает в автономном режиме, поэтому отправка кода - это повторный ввод кода для этого форума.

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

Интернет-исследование показало, что это была временная проблема, потому что система была занята. Они предложили добавить DoEvents перед оскорбительной строкой кода. Когда я делал это, ничего не работало, для всей процедуры и всех подпроцедур, которые она вызывает. Я удалил эти DoEvents.

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

Буду признателен за любую предоставленную помощь. Заранее благодарю. Кевин

Дальнейшее тестирование завершено. Я закомментировал код, который редактирует источник записи для формы frm_Test, запустил его в режиме отладки, и он работал нормально (как и ожидалось). Запустил его во время выполнения, и он вышел из строя в том же месте, та же ошибка (не ожидается). Я рассуждал, что это потому, что я редактировал его до того, как экспортировал, но это явно не так. Что-то еще должно происходить, но это остается вопросом.

Последующее наблюдение: Проведенное дополнительное тестирование не вызывает ошибок при открытом или закрытом окне VB, если его нет в моей среде выполнения. Итак, моя среда выполнения имеет следующие функции: Разрешить полное меню отключено, Разрешить контекстные меню по умолчанию отключено, Использовать специальные клавиши доступа отключены, панель навигации скрыта и заблокирована, AllowByPassKey отключена, Отображать строку состояния отключена, включить отображение разметки отключено, включены изменения дизайна в таблицах втаблица данных отключена

Я вставил MSgBox строку перед целевой строкой кода. Затем появляется последний msgBox, указывающий, что задача выполнена. Итак, я знаю, когда строка кода сработает и что весь процесс завершится в среде выполнения.

Однако во время тестирования AllowByPassKey не был активным в то время. Test One reenable «Использовать специальные ключи доступа» - Ошибка в том же месте та же ошибка. Тест два с включенной выше строкой «Разрешить контекстные меню по умолчанию» - Сбой в том же месте та же ошибка. Тест три с двумя вышеупомянутыми строками, которые были включены повторно. Отображение строки состояния - ошибка одного и того же местоположения, та же ошибкаТест четыре с тремя строчками выше, включаемое «Разрешить полные меню» - Сбой в том же месте та же ошибка. Тест 5 с четырьмя строками выше, повторно включенными «Показать панель навигации» - Сбой в том же месте та же ошибка. Тест шестой с пятью строками, приведенными выше, включенных изменений дизайна для таблиц в представлении таблицы данных - Ошибка в том же месте, та же ошибка.

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

DoCmd.ShowToolbar "Ribbon", acToolbarNo
DoCmd.NavigateTo "NavigationCategoryObjectType"
DoCmd.RunCommand acCmdWindowHide

Тест Семь с предыдущими шестью строками, закомментированная строка acToolbarNo - Сбой в том же месте та же ошибка. Протестируйте восемь с предыдущими семью строками, закомментируйте две строки, чтобы скрыть панель навигации - выдает ту же ошибку в том же месте.

Хорошо, я по существу воссоздал среду, когда тестирую базу данных вне режима отладки и та же проблемапроисходит и в том же месте.

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

Test Nine с последними восемью строками тестирования, плюс я открою окно VB в фоновом режиме, оно открыто, но пароль не предоставляетсяРедактировать код - Сбой в том же месте, та же ошибка. Тест десять с девятью линиями тестирования выше плюс я введу пароль для окна VB - процесс завершился нормально!

Хорошо, теперь, как мне это исправить? 13.10.2009 -Хорошо следующий раунд тестирования. Моя теория заключается в том, что либо процесс нарушается, потому что утверждение плохое, а это не так, либо существует теоретический недокументированный верхний предел числа строк кода, которые можно запустить. Чтобы проверить эту теорию, я перемещаю строку кода непосредственно перед оператором SetWarnings True. Я ожидаю одного из двух результатов: код продолжает исходное утверждение, доказывая, что это как-то утверждение;ИЛИ он разбивается на следующую строку кода, потенциально указывая на предел. Я изменил все предыдущие испытания обратно на исходные настройки для среды выполнения. Однако я не думаю, что это теория пределов, потому что я добавлял над ним строки кода, такие как msgboxs и операторы ошибок, для моего обработчика ошибок, и он все еще не работает в том же месте.

Тест 11 перемещаетоскорбительная строка кода вниз. Целиком корова! это сработало. Перемещение строки кода буквально на 6 строк позволило завершить ее правильно. Буквально удивительно. Я не понимаю, как это работает. В этом нет никакого смысла. Теперь я понимаю, почему это не имеет смысла. Я проверил выходную базу данных, и формы frm_test там не было, и на этот раз она не выдавала ошибку. Казнь только что пропустили? через строку это выглядит так.

Тест 12 перемещает поврежденную строку кода сразу после обновления источника записи. Снова три ожидаемых результата выполняются и пропускаются, как и раньше, в этом месте происходит сбой, в другом месте происходит сбой. Хорошо, происходит сбой в этом новом месте, сразу после изменения источника записи для него с тем же кодом ошибки 3011. Объект не найден.

Тест 13, проверяющий, проверяет, изменяет ли источник записи "блокирует" или "скрывает" формув любом случае. Три ожидаемых результата: сбой в этом месте, сбой в другом месте или завершение экспорта. Хорошо, не удалось в этом месте с тем же кодом ошибки. Таким образом, изменение свойств формы не является проблемой.

Хорошо, тест 14 Я переместил строку кода в начало выполнения кода сразу после завершения создания новой внешней базы данных. Свойства формы были обновлены, но выполнение кода в этой строке завершилось неудачно, объект ошибки 3011 не найден.

Тест 15 исправил все, что перемещало редактирование формы и строки экспорта формы в начало после создания внешней базы данных. Странная вещь произошла, код не удалось запустить полностью. Ничего не произошло. Забыл скомпилировать код перед выходом;Произошла ошибка, которую я создал случайно.

Тест 15, снова. Хорошо, тот же результат, произошел сбой в новом местоположении с той же ошибкой. 3011 объект не найден.

У меня заканчиваются варианты для проверки. Это, очевидно, строка кода, независимо от того, где я его размещаю, именно там он терпит неудачу во время выполнения, но не отказывает в режиме отладки. Он работает только правильно с открытым и разблокированным окном VB. Открытие окна VB и предоставление пароля только для экспорта формы в новую базу данных кажется безумным.

Хорошо, новая тактика. Тест 16 - я собираюсь создать новый саб, все, что он делает, это экспорт во внешнюю базу данных. Я буду называть это сабвуфером из существующего кода. Сбой в том же месте с тем же кодом ошибки.

Тест 17, и это говорит о том, что In think находит корень проблемы, я попытался импортировать форму из вновь созданной базы данных вручную. Я получил сообщение об ошибке, что для выполнения этого действия требовался пароль. Ах ха! Мне нужно предоставить пароль VBA, чтобы разрешить экспорт формы с кодом vba.

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

1 Ответ

0 голосов
/ 14 октября 2019

Я решил проблему, ну не подошел, просто теперь полностью понимаю, почему я не мог делать то, что хотел. Вы не можете экспортировать форму, содержащуюся в защищенном паролем проекте VBA. Итак, ответ на мой оригинальный вопрос: ты не можешь. Найти другое решение. Насколько я понимаю, программа должна читать код, прикрепленный к форме, и не может этого делать, если существует пароль, защищающий VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...