vba макросы Excel 2016 : Bag - Windows().Activate и Woorkbooks().Activate периодически не выполняются
Макросы написанные в VBA Excel 2010 с использованием Application.Windows(nameFile).Activate в Excel 2010 периодически не работают в Excel 2016.
- Замена на аналог
Application.Workbooks(nameFile).Activateтоже не работает. - Установка перед и после
Application.Windows(nameFile).Activateсэндвича из командApplication.EnableEvents = falseиApplication.EnableEvents = trueничего не даёт см.https://stackoverflow.com/questions/46738609/with-excel-2016-vba-will-not-activate-an-alternate-worksheet-when-the-macro-is
Проблема временно решается (до следующей перегрузки Win10) однократным ручным переключением фокуса с рабочей книги на новую nameFile(активизация окна без действий в нем) и обратно. Office2016(16.0.4954.1000) MSO (16.0.4939.1000) 32 Bit и Windows10 (версия 1809), имеют корпоративные лицензии VL и LTSC cоответственно и автоматически обновляются (все последние обновления установлены). Макросов много, и данная ошибка может возникнуть в любом из них. Очевидно что это bag MS. Есть ли решение проблемы устойчивой работы без перехода на другой Office (ИТ-ки уверяют, что Office2019 мне поможет, но я не уверен)? Возможно проблема решится переустановкой MS Excel 2016 для VL в более поздних обновлениях MS? P.S. После установки 25.02.2020 обновления KB4484256 проблема возникала только один раз. Продолжу наблюдение за поведением Excel
Команды простые, но на них нет реакции сервера автоматизации Excel 2016
`Application.Workbooks(nP5).Activate` `Application.Windows(nP5).Activate`
- Caption не меняется.
- При отладке видно, что Application.ActiveWorkbook, после выполнения указанных в заголовке команд, не меняется - т.е. как указывал на первую книгу, так и указывает.
- Все макросы начинают работать нормально, после однократного "танца с бубном" с переключением фокуса , при этом никаких изменений в макросах я не делаю. Эта проблема появилась после принудительно перехода нашей компании с Office 2010 на Office2016 в декабре прошлого года.
- Возможно ScreenUpdating для оптимизации и отключен, но как я понимаю п 3) говорит, что это здесь не при чём.
С инстансом Excel 2016 ничего не понятно. Если в MS Office 2010 все книги Excel открываемые из одного макроса находились в одном сервере Excel то в MS Office 2016, все книги открываемые из одного макроса находятся в разных серверах , как и отладчик VBA Excel (именно так показывает дерево окон MS Spy++). Но книги ведут себя, как будто все находятся в одном сервере Excel (в общем - "тёмный лес") ??? Данную особенность мне пришлось учитывать в скриптах автокликера Pilot при переходе с MS Excel 2010 на MS Excel 2016. Также замечено, что иногда, при сохранении книг выгруженных из SAP с переименованием в другой формат(xlsx), вновь созданное активное окно (обычно всегда минимизировано) теряет фокус. И чтобы скопировать данные из этого окна в буфер обмена, приходится Pilot-ом принудительно устанавливать на него фокус. Могу предположить, сильно на этом не настаивая, что при больших циклах обработки у Excel возможны проблемы с реентерабельностью. Конечно же хочется понять почему так необычно ведет себя новый офис, но это выходит за рамки моего первичного вопроса, хотя интуиция подсказывает, что, возможно, именно здесь, при определенном стечении обстоятельств и возникают проблемы у MS Office 2016 (см. заголовок = bag MS).
Ответы (1 шт):
- Проблема отображения окна находящегося в фокусе, но имеющего нулевые клиентские размеры решилась добавлением одной команды:
Application.WindowState = xlMaximized
- Выявить ситуацию с некорректными клиентскими размерами окон классов XLMAIN, EXCEL7 поможет использование
WinAPI: GetWindowRect, GetClientRect, IntersectRect и MapWindowPoints