|
|
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Как сделать макрос на событие: активация окна Excel? Workbook_Activate и Worksheet_Activate() работают только тогда, когда их активация происходит в переходом на книгу или лист соответственно из другой книги или листа, но ИЗ САМОГО ПРИЛОЖЕНИЯ Excel. А нужно как-то отследить момент активации самого приложения. Application.Windows("Book1").OnWindow тоже не срабатывает. Можно, наверное, как-то использовать идею проверки активности окна через определённый промежуток времени (макрос в OnTime) или WinAPI (в чём совершенно не разбираюсь). Но надо, чтоб событие активация Excel срабатывало только 1 раз. Кто-нибудь делал такое? Подскажете хоть посредством WinAPI, но подробный код. MS Office 97. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 10:26:20 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
toliktWorkbook_Activate и Worksheet_Activate() работают только тогда, когда их активация происходит в переходом на книгу или лист соответственно из другой книги или листа, но ИЗ САМОГО ПРИЛОЖЕНИЯ Excel. MS Office 97. Обнови Офис хотя бы до 2000. Там все нормально отрабатывается в Workbook_Activate/Deactivate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 14:58:10 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Я имел ввиду немного другое. Поясню пошагово. Применительно к Workbook_Activate. Запускаем Excel, книгу "Book1" В модуле книги "Book1" выбираем, например, событие Workbook_Activate. Пишем в нём какой-нибудь код. Например, Private Sub Workbook_Activate() MsgBox "Привет!" End Sub Создаём ещё одну книгу "Book2". Теперь, если была активна книга "Book2", то при активации книги "Book1" выскакивает сообщение "Привет!". Это - понятно. Далее, пусть активна книга "Book1". Запускаем MS Word. Окно Word становится активным, окно Excel, соответственно, неактивным. Теперь, если активировать снова окно Excel, то ожидаемого "Привет!" не выскакивает, т. к. в самом приложении Excel книга "Book1" и так как бы уже была активна. Вопрос как раз и был в том, чтоб как-то отслеживать событие - АКТИВАЦИЯ САМОГО ОКНА EXCEL . PS. Само собой, прежде чем задавать вопрос, эта проблема была проверена на более поздних версиях операционной системы (Microsoft ® Windows XP Professional SP2) и офиса (Microsoft ® Excel 2003 (11.6355.6360) SP1). Ситуёвина та же самая. ЗЫ. Завершаю пояснение, ибо, судя по всему, вопрос или его пояснение, состоящее более чем из 3-х строк, многие люди внимательно не читают. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 20:42:09 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Смотри на событие Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 22:42:02 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Excel 97 есть Workbook_WindowActivate. Однако то же самое - эффекта нет. Может быть, в коде событий просто нужно пограмотнее описать сам алгоритм? Например, для Workbook_WindowActivate я делал так: Код: plaintext 1. 2. Например, предварительно описать в модуле класса, в чём я плохо разбираюсь, или ещё что-нибудь? Я пытался делать и через модуль класса, но тоже ничего не получилось. Типа так. В проекте PERSONAL.XLS: В модуле класса Class1: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. Код: plaintext Но опять всё работает только во время нахождения в самом Excel. Попробовать как-то совместить несколько событий? Но как и какие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 23:42:45 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
хм... а действительно... Похоже что собственными средствами Экселя эту задачу не решить. Application не имеет событий дергающихся когда сам Эксель получает фокус при переключении в него из другой задачи. В принципе это ограничение можно обойти при помощи внешнего объекта. Который будет отслеживать свою видимость на экране или вешать хук на родительское окно (в данном случае на окно Экселя) и перехватывать WM_ACTIVE. Такой объект надо будет класть на все листы книги, а то мало ли с какого листа пользователь ушел в другую задачу. Этот объект можно замаскировать например под анимированое лого или всплывающую подсказку.... А вообще, если задача не решается стандартными средствами инструмента надо либо пересмотреть задачу, либо взять другой инструмент. toliktЯ пытался делать и через модуль класса, но тоже ничего не получилось.Не получилось вообще ничего или не получилось сделать желаемое? Вот в принципе простенькая книга с двумя единственными событиями Workbook_WindowActivate и App_WindowActivate. Открой ее и еще какую-нибудь книгу потом попереключайся, заодно увидишь в чем разница между этими событиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 01:33:05 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Вариант, наверное, не самый лучший, т.к. не событие перехватывается, а запускается ontime постоянно, но с задачей справится: этот код поместить в ThisWorkbook Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 10:56:11 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
Спасибо vbapro, вариант работает. Учитывая, что он пока единственный, так вообще - самый лучший. А периодическое мерцание, конечно, есть, но не сильно мешает. Тормозов особых тоже не заметно. Замечания мелкие есть. Наверное, в коде Workbook Код: plaintext 1. 2. 3. Для непосредственной работы основной код переделал не для одноразового, а постоянного отслеживания активации окна Excel. Вместо Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. Не мог разобраться со следующим глюком. Если зайти в этот код и просто выделить какую-либо строку кода, напр. MsgBox "Стало окно активным", то потом текущую рабочую книгу невозможно закрыть, она появляется и появляется. Приходится закрывать полностью приложение. Или это только у меня так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 18:04:15 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
toliktСпасибо vbapro, вариант работает. пожалуйста toliktНаверное, в коде Workbook Код: plaintext 1. 2. 3. нет, не лишняя, т.к. она инициализирует статические переменные но не запускает ontime. но второй и последующие запуски уже будут рабочими. tolikt использую что-то типа Код: plaintext 1. 2. 3. Если зайти в этот код и просто выделить какую-либо строку кода, напр. MsgBox "Стало окно активным", то потом текущую рабочую книгу невозможно закрыть, она появляется и появляется. Приходится закрывать полностью приложение. Или это только у меня так? попробуй так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 18:27:02 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
vbaproIf MsgBox("Стало окно активным, продолжить слежение?", vbYesNo) = vbYes Then Как вариант, конечно, подходит. Но каждый раз при активации окна отвечать на вопрос очень неудобно. Как-нибудь бы сделать, чтобы зависило только от того, открыта соответствующая книга или нет. Как алгоритм варианта, можно рассмотреть такой. При открытии книги инициализировать какую-то глобальную переменную. А в макросе, запущенном по OnTime проверять эту глобальную переменную. И если она, например, равна False, то макрос больше не запускать. Чувствую, что это как-то делается через модули классов, но самому реализовать не получилось. Ещё один вариант: при закрытии книги остановить сам процесс, запущенный по OnTime. Но как это сделать, не знаю. Этот вопрос рассматривался в другой теме: Останов Application.OnTime. Как остановить выполнение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2007, 12:02:24 |
|
||
|
Application Activate Events? Событие - активация окна Excel, как сделать?
|
|||
|---|---|---|---|
|
#18+
идеи верные, на первый взгляд, но не в глобальной переменной хранить, а в реестре или в свойствах файла, т.к. переменная может потерять значение когда макрос не быдет выполняться. Для того чтоб книга не открывалась, то обработчик таймера поместить в Personal и в нем логику проверок вызова сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2007, 12:41:42 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=34231732&tid=2181846]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 323ms |

| 0 / 0 |
