Я откопал свой последний крупный проект Access, который взаимодействовал с Word (около 2016 г.), где я боролся с подобными проблемами. Я вижу много-много Debug.Print
утверждений (некоторые прокомментированы, некоторые все еще активны), но в отличие от того, что я вспомнил ранее в моих комментариях, я больше не вижу никаких «ожиданий»! Из того, что я сейчас вспоминаю и после повторной проверки кода, большинство проблем было решено с помощью
, обеспечивающего надежную обработку ошибок и лучшие методы для постоянного закрытия объектов автоматизации (и / или освобождения объектов, еслиЯ хотел, чтобы экземпляры сохранялись)
подписка и использование соответствующего объекта автоматизации события для обнаружения и обработки взаимодействия, а не для того, чтобы пытаться принудить все в сериализованную работу-потом-код ожидания. Для этого я поместил весь код автоматизации в хорошо структурированные классы, которые объявляли объекты автоматизации WithEvents
(конечно, в VBA), а затем определяли соответствующие обработчики событий для действий, которые я выполнял. Теперь я вспоминаю, наконец, что мне удалось избежать странных ошибок, зависаний приложений и т. Д.
Вы также никогда не сможете получить хороший ответ на такой вопрос, поэтому, несмотря на это, яЯ не абсолютный эксперт по разработке Office, у меня был собственный опыт с такими ошибками, поэтому я поделюсь своими 2 центами. Это может быть неудовлетворительным, но после того, как я столкнулся с подобным поведением с использованием объектов автоматизации делопроизводства, я понимаю, что взаимодействие между процессами ОС не является детерминированнымТем более, что в VBA обычно нет проблем с многопоточностью или параллелизмом, может быть странно иметь дело с объектами, которые ведут себя непредсказуемым образом. Временные интервалы, предоставляемые каждому процессу отдельно, зависят от операционной системы и будут сильно различаться в зависимости от множества процессоров / ядер, запущенных процессов, управления памятью и т. Д. Несмотря на назначение объектов автоматизации - для управления экземплярами офисных приложений -- API не предназначены для межприкладных процессов.
Хотя было бы замечательно, если бы старый код автоматизации вызывал больше полезных ошибок, возможно, вложенных исключений (например, в .Net и других современных средах), то, чтоуказывает на задержки и таймауты в обратных вызовах между объектами автоматизации, вместо этого вы получаете смесь различных контекстных ошибок.
Мое оборудование старое, но все еще работает. У меня часто бывают задержки, даже если это происходит на секунду, при переключении между приложениями и т. Д. Вместо того, чтобы думать об этом как об ошибке, я просто воспринимаю это как медленную машину, просто жду и продолжаю. Может быть полезно рассматривать этот тип случайных ошибок как похожие задержки. Если ждущий вызов здесь или там решает проблему, пусть и раздражающую, это может быть просто лучшим решением ... жди и продолжай.
Время от времени после отладки этих типов проблем я на самом деле обнаруживаю основнуюпроблема и сможет это исправить. По крайней мере, я смог бы избежать реальных проблем с данными, несмотря на возникающие ошибки, как вы описали. Но даже когда я почувствовал, что понял проблему, ответом все-таки часто было то, что вы сделали, и просто добавили короткое ожидание.